日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片

發布時間:2024/8/1 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是屬于我的第一篇博文,首先說明一下,文章屬性為原創,其實不能說是原創,我是在學習的過程中根據自己的理解整理的。文章內容大多為書本上的內容,書本是郭霖的《第一行代碼》。

? ? ? ?正文:現在很多應用程序會調用攝像頭的拍照功能,比如哪個程序要上傳一張圖片作為用戶頭像,這是啟用攝像頭拍照會很方便。當然,還有第二種方法,就是在本地圖庫選取已經被保存的圖片。現在,我就根據自己學習的過程,將這部分只是進行整理,如下:


public class MainActivity extends AppCompatActivity {private Button button;private ImageView imageView;private Uri imageuri;private Button choose;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);button = (Button) findViewById(R.id.button);imageView = (ImageView) findViewById(R.id.imageView);choose = (Button) findViewById(R.id.button2);//此按鈕事件是拍照,啟動攝像機的功能button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//創建一個File對象,用于存儲接下來照相機拍攝的照片File file = new File(Environment.getExternalStorageDirectory(), "output_image.jpg");if (file.exists()) {file.delete();}try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}imageuri = Uri.fromFile(file);//下面這個intent對象就是用于啟動照相機的Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);//指定圖片的輸出地址startActivityForResult(intent, 1);//啟動照相機,這里傳入的參數1,其實只要是固定一個值都行,//比較好的做法是聲明一個全局常量比較好,我在這里沒有這么做。}});//此按鈕事件是選取本地圖片,啟動相冊choose.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("android.intent.action.GET_CONTENT");//這個intent對象是用于開啟本地圖庫的intent.setType("image/*");//給intent對象設置必要的參數startActivityForResult(intent, 3);//開啟本地圖庫}});}@Override//因為我們用startActivityForResult方法啟動活動,所有它們處理完結果后,會回調上一個活動的onActivityResult方法,這里我們就在MainActivity重寫此方法protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case 1://就是照相機拍好了照片來回調的這個方法的case 1,這個時候我們想要啟動照片的裁剪程序if (resultCode == RESULT_OK) {Intent intent = new Intent("com.android.camera.action.CROP");//這個intent對象啟動裁剪程序intent.putExtra("scale", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);//設置圖片的輸出地址intent.setDataAndType(imageuri, "image/*");//設置圖片的返回格式startActivityForResult(intent, 2);}break;case 2://裁剪好了的圖片回調此方法的case 2,這個時候我們就要將裁剪好的圖片設置到imageview里if (resultCode == RESULT_OK) {try {//BitmapFactory的decodeStream()方法將照片解析成Bitmap對象Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageuri));imageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}break;case 3://本地圖庫選取圖片后,回調此方法的case 3,在這里我們主要做的就是圖片的處理工作if (resultCode == RESULT_OK) {//判斷系統版本號,如果API>19,即Android 4.4版本以上用這個方法處理圖片if (Build.VERSION.SDK_INT >= 19) {handleImageOnKitKat(data);}else {//android4.4以下,用這個方法處理圖片handleImageBeforeKitKat(data);}}break;default:break;}}@TargetApi(19)private void handleImageOnKitKat(Intent data) {//其實這個方法的目標很簡單,就是要獲取圖片的真實路徑imagepath,然后我們會再提供一個方法將imagepath作為參數來顯示圖片String imagepath = null;//android4.4以上的版本,我們獲取的圖片uri不是真實的圖片uri,是封裝過的,不能直接用來顯示圖片,我們要進行解析Uri uri = data.getData();//通過傳入intent參數來獲取信息,圖片的內容uri//接下來的內容看似復雜,其實很簡單,我們進行了很多判斷,首先判斷這個uri是否為document類型,//如果是document類型的話,就取出document id處理,如果不是,就普通方式處理//另外,我們又對uri的權限部分進行判斷,如果是media格式,則document id還要再次進行解析if (DocumentsContract.isDocumentUri(this, uri))//判斷如果是document類型,則通過document id處理{String docId = DocumentsContract.getDocumentId(uri);//通過uri獲取document id。//判斷我們的uri的權限部分,media格式,對document id用":"分割,取出真正的數字idif ("com.android.provider.media.documents".equals(uri.getAuthority())) {//split方法返回的結果是一個數組,我們選取第二個,即角標為1,這樣我們就解析出數字格式的idString id = docId.split(":")[1];String selection = MediaStore.Images.Media._ID + "=" + id;//用id構建新的條件語句,并且在后面query()方法//進行數據庫查詢是作為參數,主要是約束我們的查詢條件//getImagepath()方法是我們自己提供的用來獲取圖片真實路徑imagepath = getImagepath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);} else if ("com.android.provider.downloads.documents".equals(uri.getAuthority())) {Uri contentUri = ContentUris.withAppendedId(Uri.parse("conten://downloads/public_downloads"), Long.valueOf(docId));imagepath = getImagepath(contentUri, null);}} else if ("content".equalsIgnoreCase(uri.getScheme())) {//如果不是document類型的uri,則使用普通方法處理imagepath = getImagepath(uri, null);}displayImage(imagepath);//最后,我們根據路徑顯示圖片}private void handleImageBeforeKitKat(Intent data){Uri uri=data.getData();String imagepath=getImagepath(uri,null);displayImage(imagepath);}//獲取圖片路徑的方法private String getImagepath(Uri uri, String selection) {String path = null;//通過uri和selection獲取真實的圖片路徑//其實selection就是一個約束條件,讓我們指定查詢哪一行,就好比name=lee,age=18這樣Cursor cursor = getContentResolver().query(uri, null, selection, null, null);if (cursor != null) {if (cursor.moveToNext()) {path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}cursor.close();}return path;}//顯示圖片的方法private void displayImage(String imagepath){if (imagepath!=null){//BitmapFactory的decodeFile解析路徑,使圖片為Bitmap對象Bitmap bitmap=BitmapFactory.decodeFile(imagepath);imageView.setImageBitmap(bitmap);}else {Toast.makeText(this,"圖片獲取失敗",Toast.LENGTH_SHORT).show();}}


? ? ? ? 其實,很多照片即使裁剪了以后體積還是很大,直接加載到內存,很容易使程序崩潰。更好的做法是根據項目需求對照片進行適當的壓縮,然后加載到內存。這個時候就要考驗我們的閱讀文檔能力啦,學無止境啊。



總結

以上是生活随笔為你收集整理的Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。