Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片
生活随笔
收集整理的這篇文章主要介紹了
Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這是屬于我的第一篇博文,首先說明一下,文章屬性為原創(chuàng),其實(shí)不能說是原創(chuàng),我是在學(xué)習(xí)的過程中根據(jù)自己的理解整理的。文章內(nèi)容大多為書本上的內(nèi)容,書本是郭霖的《第一行代碼》。
? ? ? ?正文:現(xiàn)在很多應(yīng)用程序會(huì)調(diào)用攝像頭的拍照功能,比如哪個(gè)程序要上傳一張圖片作為用戶頭像,這是啟用攝像頭拍照會(huì)很方便。當(dāng)然,還有第二種方法,就是在本地圖庫選取已經(jīng)被保存的圖片。現(xiàn)在,我就根據(jù)自己學(xué)習(xí)的過程,將這部分只是進(jìn)行整理,如下:
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);//此按鈕事件是拍照,啟動(dòng)攝像機(jī)的功能button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//創(chuàng)建一個(gè)File對(duì)象,用于存儲(chǔ)接下來照相機(jī)拍攝的照片F(xiàn)ile 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);//下面這個(gè)intent對(duì)象就是用于啟動(dòng)照相機(jī)的Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);//指定圖片的輸出地址startActivityForResult(intent, 1);//啟動(dòng)照相機(jī),這里傳入的參數(shù)1,其實(shí)只要是固定一個(gè)值都行,//比較好的做法是聲明一個(gè)全局常量比較好,我在這里沒有這么做。}});//此按鈕事件是選取本地圖片,啟動(dòng)相冊(cè)choose.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("android.intent.action.GET_CONTENT");//這個(gè)intent對(duì)象是用于開啟本地圖庫的intent.setType("image/*");//給intent對(duì)象設(shè)置必要的參數(shù)startActivityForResult(intent, 3);//開啟本地圖庫}});}@Override//因?yàn)槲覀冇胹tartActivityForResult方法啟動(dòng)活動(dòng),所有它們處理完結(jié)果后,會(huì)回調(diào)上一個(gè)活動(dòng)的onActivityResult方法,這里我們就在MainActivity重寫此方法protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case 1://就是照相機(jī)拍好了照片來回調(diào)的這個(gè)方法的case 1,這個(gè)時(shí)候我們想要啟動(dòng)照片的裁剪程序if (resultCode == RESULT_OK) {Intent intent = new Intent("com.android.camera.action.CROP");//這個(gè)intent對(duì)象啟動(dòng)裁剪程序intent.putExtra("scale", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);//設(shè)置圖片的輸出地址intent.setDataAndType(imageuri, "image/*");//設(shè)置圖片的返回格式startActivityForResult(intent, 2);}break;case 2://裁剪好了的圖片回調(diào)此方法的case 2,這個(gè)時(shí)候我們就要將裁剪好的圖片設(shè)置到imageview里if (resultCode == RESULT_OK) {try {//BitmapFactory的decodeStream()方法將照片解析成Bitmap對(duì)象Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageuri));imageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}break;case 3://本地圖庫選取圖片后,回調(diào)此方法的case 3,在這里我們主要做的就是圖片的處理工作if (resultCode == RESULT_OK) {//判斷系統(tǒng)版本號(hào),如果API>19,即Android 4.4版本以上用這個(gè)方法處理圖片if (Build.VERSION.SDK_INT >= 19) {handleImageOnKitKat(data);}else {//android4.4以下,用這個(gè)方法處理圖片handleImageBeforeKitKat(data);}}break;default:break;}}@TargetApi(19)private void handleImageOnKitKat(Intent data) {//其實(shí)這個(gè)方法的目標(biāo)很簡(jiǎn)單,就是要獲取圖片的真實(shí)路徑imagepath,然后我們會(huì)再提供一個(gè)方法將imagepath作為參數(shù)來顯示圖片String imagepath = null;//android4.4以上的版本,我們獲取的圖片uri不是真實(shí)的圖片uri,是封裝過的,不能直接用來顯示圖片,我們要進(jìn)行解析Uri uri = data.getData();//通過傳入intent參數(shù)來獲取信息,圖片的內(nèi)容uri//接下來的內(nèi)容看似復(fù)雜,其實(shí)很簡(jiǎn)單,我們進(jìn)行了很多判斷,首先判斷這個(gè)uri是否為document類型,//如果是document類型的話,就取出document id處理,如果不是,就普通方式處理//另外,我們又對(duì)uri的權(quán)限部分進(jìn)行判斷,如果是media格式,則document id還要再次進(jìn)行解析if (DocumentsContract.isDocumentUri(this, uri))//判斷如果是document類型,則通過document id處理{String docId = DocumentsContract.getDocumentId(uri);//通過uri獲取document id。//判斷我們的uri的權(quán)限部分,media格式,對(duì)document id用":"分割,取出真正的數(shù)字idif ("com.android.provider.media.documents".equals(uri.getAuthority())) {//split方法返回的結(jié)果是一個(gè)數(shù)組,我們選取第二個(gè),即角標(biāo)為1,這樣我們就解析出數(shù)字格式的idString id = docId.split(":")[1];String selection = MediaStore.Images.Media._ID + "=" + id;//用id構(gòu)建新的條件語句,并且在后面query()方法//進(jìn)行數(shù)據(jù)庫查詢是作為參數(shù),主要是約束我們的查詢條件//getImagepath()方法是我們自己提供的用來獲取圖片真實(shí)路徑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);//最后,我們根據(jù)路徑顯示圖片}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獲取真實(shí)的圖片路徑//其實(shí)selection就是一個(gè)約束條件,讓我們指定查詢哪一行,就好比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對(duì)象Bitmap bitmap=BitmapFactory.decodeFile(imagepath);imageView.setImageBitmap(bitmap);}else {Toast.makeText(this,"圖片獲取失敗",Toast.LENGTH_SHORT).show();}}
? ? ? ? 其實(shí),很多照片即使裁剪了以后體積還是很大,直接加載到內(nèi)存,很容易使程序崩潰。更好的做法是根據(jù)項(xiàng)目需求對(duì)照片進(jìn)行適當(dāng)?shù)膲嚎s,然后加載到內(nèi)存。這個(gè)時(shí)候就要考驗(yàn)我們的閱讀文檔能力啦,學(xué)無止境啊。
總結(jié)
以上是生活随笔為你收集整理的Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大量思科设备存在IPv6死亡之Ping漏
- 下一篇: [RK3288][Android6.0]