3

アプリからデフォルトのギャラリーアプリを呼び出して、写真を選択しています。以下は、ギャラリーから選択した画像パスを取得するための私のコードです。一部を除くすべての写真で問題なく動作しています。PICASA でアップロードした写真をギャラリーから選択すると、アプリが強制終了します。私を助けてください。


内部 onActivityResult()...

            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String selectedPhotoPath = cursor.getString(columnIndex).trim();  <<--- NullPointerException here
            cursor.close(); 
            bitmap = BitmapFactory.decodeFile(selectedPhotoPath);
            ......      
4

4 に答える 4

7

data.getData();画像の取得に使用するアプリによっては、null を返す場合があります。これを回避するには、上記のコードを で使用しますonActivityResult

/**
*Retrieves the path of the image that was chosen from the intent of getting photos from the galery
*/
Uri selectedImageUri = data.getData();

// OI FILE Manager
String filemanagerstring = selectedImageUri.getPath();

// MEDIA GALLERY
String filename = getImagePath(selectedImageUri);

String chosenPath;

if (filename != null) {

   chosenPath = filename;
} else {

   chosenPath = filemanagerstring;
}

変数chosenPathには、選択した画像の正しいパスが含まれます。メソッドgetImagePath()は次のとおりです。

public String getImagePath(Uri uri) {
    String selectedImagePath;
    // 1:MEDIA GALLERY --- query from MediaStore.Images.Media.DATA
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if (cursor != null) {
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        selectedImagePath = cursor.getString(column_index);
    } else {
        selectedImagePath = null;
    }

    if (selectedImagePath == null) {
        // 2:OI FILE Manager --- call method: uri.getPath()
        selectedImagePath = uri.getPath();
    }
    return selectedImagePath;
}
于 2012-07-09T13:26:08.947 に答える
2

以下のコードを試してください

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK){
 Uri targetUri = data.getData();
 textTargetUri.setText(targetUri.toString());
 Bitmap bitmap;
 try {
  bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
  ....
 } catch (FileNotFoundException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}
}

また

以下のリンクをご確認ください

また

アプリのギャラリー (SD カード) から画像を選択する方法は?

于 2012-07-09T13:17:55.683 に答える
0

現在の Android システム (最初のバージョン -> 2.3.3 -> 4.4.2 まで) では、複数のファイルを選択できないように見えるため、それを行うにはカスタム ギャラリーが必要です。

何度も調査したCustom Camera Gallery library結果、すでにそのことを行うのに役立つことがわかりました。

于 2015-12-03T09:30:19.550 に答える
0
String ImagePath  = "";
private void setImageFromGallery(Intent data) {
    Uri selectedImage = data.getData();
    String[] filePathColumn = {MediaStore.Images.Media.DATA};
    Cursor cursor = this.getContentResolver().query(selectedImage, filePathColumn, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();
        Log.i("choosepath", "image" + picturePath);
        ImagePath = picturePath;
    } else {
        ImagePath = selectedImage.getPath();   // Add this line 
    }
   ImageView imgView = (ImageView) findViewById(R.id.imgView);
   imgView.setImageBitmap(BitmapFactory.decodeFile(imagePath));
    Bitmap bitmap = Utilities.rotateImage(pictureImagePath);
}
于 2015-11-17T15:39:59.423 に答える