1. 程式人生 > >Android獲取相簿圖片路徑為空

Android獲取相簿圖片路徑為空

一個拍照和相簿選擇圖片的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);