国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

學習使用安卓系統的相機和相冊

2019-11-06 09:54:54
字體:
來源:轉載
供稿:網友

概述

這里主要介紹如何調用系統的手機進行拍照,或者直接從相冊中找圖片。


學習使用系統自帶的相機

權限

在Android4.4系統之前,訪問SD卡的應用關聯目錄要聲明權限,之后就可以不用聲明了,為了兼容老版本,還是聲明權限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

代碼一:準備工作

public static final int TAKE_PHOTO =1; //表示打開相機的標識符,知己定義的 PRivate ImageView picture; //用來展示最后的圖片 private Uri imageUri; //表示圖片文件的真實路徑 ---------------接下來是打開相機前的準備工作------------------ File outputImage = new File(getExternalCacheDir(),"output_image.jpg"); //創建File對象,用于存貯拍照后的照片 //上述文件路徑打印出來如下: // /storage/emulated/0/Android/data/com.yuyi.viewevent/cache/output_image.jpg try { if (outputImage.exists()){ outputImage.delete();//如果已經有這個對象了,則刪除。 } outputImage.createNewFile();//在指定的路徑下創建一個新的空文件 } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT >= 24){ imageUri=FileProvider .getUriForFile(MainActivity.this,"com.yuyi.viewevent",outputImage); //參數一是:Context對象,參數二:任意的字符串,參數三:file對象 //詳細介紹,在最后面。 }else { imageUri = Uri.fromFile(outputImage); /**前面那個版本判斷如果運行低于7.0的就直接把file對象轉換成Uri對象, 得到一個本地真實路徑,如果7.0以上,直接使用本地真實路徑會認為不安全, 所以使用了FileProvider這個特殊的內容提供器,可以選擇性地將封裝過得 Uri共享給外部。 */ } //打印出imageUri的log如下: file:///storage/emulated/0/Android/data/com.yuyi.viewevent/cache/output_image.jpg //隱世意圖啟動相機 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);//將uri傳遞進去 startActivityForResult(intent,TAKE_PHOTO);

代碼二:對于拍照結果的處理

case TAKE_PHOTO: if (resultCode == RESULT_OK){ try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); //將存在本地的圖片進行讀取成為bitmap picture.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break;

學習讀取相冊中的圖片

代碼一

public static final int CHOOSE_PHOTO=2; //作為從相冊選取的標識符 private ImageView picture; //表示用于展示的圖片 private Uri imageUri; //表示文件的真實路徑

代碼二

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_DENIED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);//動態獲取權限 }else { openAlbum();//此方法表示主動去打開相冊 } /**在這里面完成的是先進行運行時權限處理,動態去獲取權限,因為相冊中的照片都是存儲 在SD卡上,我們要從SD卡中讀取照片就要這個權限,表示授予了程序對SD卡讀和寫的能力。*/
獲取運行時權限之后,再走這個重寫的方法: @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case 1: if (grantResults.length > 0 &&grantResults[0] == PackageManager.PERMISSION_GRANTED){ openAlbum();//表示用戶最后給了權限,可以去打開相冊 }else { Toast.makeText(this,"未獲取權限",Toast.LENGTH_SHORT).show(); } break; } }
接下來會走打開相冊的方法: private void openAlbum() { Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); startActivityForResult(intent,CHOOSE_PHOTO); }
當選擇了照片之后,走下列方法:case CHOOSE_PHOTO: if (resultCode == RESULT_OK){ if (Build.VERSION.SDK_INT >=19){ handleImageOnkitKat(data); //上述方法表示:4.4及以上系統使用這個方法處理圖片 }else { handleImageBeforKitKat(data); //上述方法表示:4.4及以下系統使用這個方法處理圖片 } } break;//因為4.4以上系統的手機,選中相冊的圖片不再返回圖片真實的Uri了,而是一個封裝過的Uri,因此要對于這個Uri進行解析才可以,

先看看在4.4以上系統使用時候,如何處理圖片: 這里寫圖片描述


將從相冊得到的數據進行解析結果進行轉換/**因為返回的Uri是doucument類型的話,得到doucument id,如過這個uri的authority是media格式的話,還需通過字符串分割方式取出后半部分才能得到真的數字id,取出的id用于構建新的Uri的條件語句,然后將值傳入getImagePath(),就可以得到真實路徑,最后進行展示就可以,別的類型的比如file和content類型的可以直接進行解析。*/ private String getImagePath(Uri uri,String selection){ String path = null;Cursor cursor = getContentResolver().query(uri,null,selection,null,null); if (cursor != null){ if (cursor.moveToFirst()){ path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); } cursor.close(); } return path; }
針對與4.4一下的版本private void handleImageBeforKitKat(Intent data) { Uri uri = data.getData(); String imagepath = getImagePath(uri,null); displayImage(imagepath); } //由于沒有封裝過,可以直接進行解析。
展示圖片的方法private void displayImage(String imagePath){ if (imagePath != null){ Bitmap bitmap = BitmapFactory.decodeFile(imagePath); picture.setImageBitmap(bitmap); }else { Toast.makeText(this,"失敗了",Toast.LENGTH_SHORT).show(); } } //核心思想就是根據路徑轉換成為Bitmap圖片
關于內容提供器的配置首先:在清單文件中<provider android:authorities="com.yuyi.viewevent.fileprocider" //authorities 屬性的值必須和剛才FileProvider.getUriForFile()方法中的第二個參數一致 android:name="android.support.v4.content.FileProvider" //name 的值是固定的 android:exported="false" android:grantUrxml/file_paths"/> //內部使用的<mete_data>用來指定Uri的共享路徑,并引用了一個@xml/file_paths的資源</provider>new->xml(文件夾名字)->file_paths.xml文件<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name = "my_images" path=""/></paths>

總結

這里只是講了對于圖片的獲取,沒有涉及對于圖片裁剪的處理,內容主要是自學自《第一行代碼》,感謝郭霖老師。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 酉阳| 台湾省| 辰溪县| 鸡西市| 汝州市| 西峡县| 威宁| 奉新县| 丹棱县| 南丹县| 南汇区| 偏关县| 宜昌市| 丘北县| 环江| 绿春县| 聂拉木县| 沙湾县| 平江县| 临城县| 通化市| 靖州| 连州市| 濉溪县| 双江| 海盐县| 博客| 五原县| 彭泽县| 资阳市| 尖扎县| 都昌县| 高唐县| 雅江县| 武宁县| 丰镇市| 台山市| 城固县| 赣榆县| 新化县| 阳山县|