Android獲取相簿圖片路徑為空
阿新 • • 發佈:2019-01-26
一個拍照和相簿選擇圖片的demo
注意:在有些機型上,這種寫法獲取到的相簿圖片的路徑為空,先看demo,解決方法在後面
public class MainActivity extends Activity{
private static final int TAKE_PICTURE = 0;
private static final int CHOOSE_PICTURE = 1;
private static final int SCALE = 5;//照片縮小比例
private ImageView iv_image = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_image = (ImageView) this.findViewById(R.id.img);
this.findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showPicturePicker(MainActivity.this);
}
});
this.findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case TAKE_PICTURE:
//將儲存在本地的圖片取出並縮小後顯示在介面上
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/image.jpg");
Bitmap newBitmap = ImageTools.zoomBitmap(bitmap, bitmap.getWidth() / SCALE, bitmap.getHeight() / SCALE);
//由於Bitmap記憶體佔用較大,這裡需要回收記憶體,否則會報out of memory異常
bitmap.recycle();
//將處理過的圖片顯示在介面上,並儲存到本地
iv_image.setImageBitmap(newBitmap);
ImageTools.savePhotoToSDCard(newBitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis()));
break;
case CHOOSE_PICTURE:
ContentResolver resolver = getContentResolver();
//照片的原始資源地址
Uri originalUri = data.getData();
// 獲取照片路徑
String[] proj = {MediaStore.Images.Media.DATA};
// 好像是Android多媒體資料庫的封裝介面,具體的看Android文件
Cursor cursor = managedQuery(originalUri, proj, null, null, null);
// 按我個人理解 這個是獲得使用者選擇的圖片的索引值
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
// 將游標移至開頭 ,這個很重要,不小心很容易引起越界
cursor.moveToFirst();
// 最後根據索引值獲取圖片路徑
String path = cursor.getString(column_index);
try {
//使用ContentProvider通過URI獲取原始圖片
Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, originalUri);
if (photo != null) {
//為防止原始圖片過大導致記憶體溢位,這裡先縮小原圖顯示,然後釋放原始Bitmap佔用的記憶體
Bitmap smallBitmap = ImageTools.zoomBitmap(photo, photo.getWidth() / SCALE, photo.getHeight() / SCALE);
//釋放原始圖片佔用的記憶體,防止out of memory異常發生
photo.recycle();
// iv_image.setImageBitmap(smallBitmap);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
public void showPicturePicker(Context context){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("圖片來源");
builder.setNegativeButton("取消", null);
builder.setItems(new String[]{"拍照","相簿"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case TAKE_PICTURE:
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"image.jpg"));
//指定照片儲存路徑(SD卡),image.jpg為一個臨時檔案,每次拍照後這個圖片都會被替換
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, TAKE_PICTURE);
break;
case CHOOSE_PICTURE:
Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);
openAlbumIntent.setType("image/*");
startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);
break;
default:
break;
}
}
});
builder.create().show();
}
}
解決獲取相簿圖片路徑為空的方法:
如果intent.setAction(Intent.ACTION_GET_CONTENT);話可能在4.4以後的版本機型會獲取不到真實的路徑,所以改成
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, CHOOSE_PICTURE);