最近遇到也一個需求:調用系統相機拍照,并且照片可以在系統相冊顯示。
關于照片顯示在系統相冊
這個問題,因為安卓機型太多了,各大廠商都對原生系統進行了不同程度的定制,所以在一般情況下,有的手機會把圖片直接顯示在相冊最前方,但是有的手機卻只能在二級文件夾內找到我們拍的照片,兩張情況如下圖所示:
微信拍攝的照片直接顯示最前
自己應用調用相機拍照后某些手機只能在二級文件夾下找到(aaaaaa)
那么問題來了,微信,qq等它們是怎么實現將本應用拍的照片顯示在系統相冊最前方,而不用再往二級文件夾查找呢?
這個問題我和朋友們討論之后覺得最有可能的原因就是手機系統對這些App進行了特殊處理,為了驗證這個想法,我做了一個實驗。
為了驗證微信的圖片路徑是否被“特殊處理”了做的實驗:
- 首先找到微信圖片在本機的存儲路徑,我的手機是小米5,所以它的路徑是:sd卡根目錄+/Tencent/MicroMsg/WeiXin/;
- 在自己的demo中調用系統相機拍照,并且設置拍照后的圖片保存路徑為上一步中的路徑,文件名為當前系統時間。
String name = System.currentTimeMillis() + ".jpg";
imagePath = new File(rootPath + "/Tencent/MicroMsg/WeiXin/", name);
if (!imagePath.exists()) {
imagePath.mkdirs();
}
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imagePath));//設置拍照后圖片的保存路徑
3.拍照后發現,原本放到aaaaaa路徑的話,圖片不會顯示在最前方,但是當我們把圖片的保存位置設置為微信圖片的保存路徑后,會正常顯示在相冊最前方。
---------------------------------------------------我是分割線-------------------------------------
下面記錄下實現調用相機拍照并保存的一種方法。
1 . 添加權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
2 . 拍照的意圖
Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
String name = System.currentTimeMillis() + ".jpg";
imagePath = new File(rootPath + "/aaaaaa/", name);
if (!imagePath.exists()) { imagePath.getParentFile().mkdir();
}
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imagePath));// 設置圖片輸出路徑
imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // 圖片質量
3 . 拍照成功后在onActivityResult通知圖庫刷新
try {
MediaStore.Images.Media.insertImage(getContentResolver(), imagePath.getAbsolutePath(), imagePath.getName(), null);//圖片插入到系統圖庫
}catch (FileNotFoundException e) {
e.printStackTrace();
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + imagePath.getAbsolutePath())));//通知圖庫刷新