0

ユーザーがそのアクティビティの ImageView に画像を追加できるアクティビティを作成しました。アクティビティのコンテキスト メニューを開き、ユーザーがギャラリーから写真を選択するか、カメラで写真を撮るかを選択できるボタンを作成しました。最初のオプション - ギャラリーから写真を選ぶ - を選択すると、

問題なく動作します。ギャラリーが開き、写真を選択すると、アクティビティが再開され、写真が ImageView に追加されます。2 番目のオプションを選択して写真を撮り、アクティビティを再開すると、 奇妙なことが起こり始めます。


  1. コンテキスト メニューをもう一度開いてギャラリーを開こうとすると、代わりにカメラ アクティビティが開かれます
  2. カメラ アクティビティを閉じてアクティビティを再開すると、[操作を完了する] ダイアログが表示されます
  3. ギャラリーを開いて写真を選択すると、NullPointerException がスローされます

この動作と例外が発生するのはなぜですか? 同様のトピックを検索してみましたが、解決策が見つかりませんでした。
以下は私の活動の方法です

public boolean onContextItemSelected(MenuItem item) {
    super.onContextItemSelected(item);
    switch(item.getItemId()) {
    case R.id.cm_Select_picture: {
        // TODO open gallery
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, ""), RC_SELECT_PICTURE);
    }
    case R.id.cm_Take_picture: {
        // TODO open camera 
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, RC_TAKE_PICTURE);
    }
    default: return false;
    }
}


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == RESULT_OK) {
        switch(requestCode) {
        case RC_SELECT_PICTURE: {
            Log.d(TAG, "Case select picture");
            Uri selectedImageUri = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(selectedImageUri
                    , filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = cursor.getString(columnIndex);
            cursor.close();
            Bitmap pic = BitmapFactory.decodeFile(filePath);
            goodsImage.setImageBitmap(pic);
        }
        case RC_TAKE_PICTURE: {
            Log.d(TAG, "Case take picture");
            if(data.getExtras().get("data") != null) {
                Bitmap pic = (Bitmap) data.getExtras().get("data");
                goodsImage.setImageBitmap(pic);
            }
        }
        }
    }
}


04-26 01:34:59.529: E/AndroidRuntime(20531): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { dat=content://media/external/images/media/9 }} to activity {com.forestassistant/com.statistics.GoodsActivity}: java.lang.NullPointerException
4

1 に答える 1

1

以前はアクティビティからカメラ アクティビティを呼び出していましたが、うまく機能しました。コードは次のとおりです。

 setMediaUri(getNewMediaFilePath(actOwner.getContentResolver()));
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, getMediaUri());
                startActivityForResult(cameraIntent, CAMERA_CAPTURE_REQUEST_CODE);

結果のコールバック時

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK 
            && requestCode == CAMERA_CAPTURE_REQUEST_CODE) {
        Drawable toRecycle= imgView.getDrawable();
        if (toRecycle != null) {                
            ((BitmapDrawable)imgView.getDrawable()).getBitmap().recycle();
        }
        mImg = decodeFileIntoRequiredSize(getPath(getMediaUri(),this), requiredSizeForImage);
        imgView.setImageBitmap(mImg);           
    } 
public Bitmap decodeFileIntoRequiredSize(String filePath,int requiredSize){
    Bitmap b = null;
    try {
        File f = new File(filePath);
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        FileInputStream fis = new FileInputStream(f);
        BitmapFactory.decodeStream(fis, null, o);
        fis.close();
        int scale = 1;
        if (o.outHeight > requiredSize || o.outWidth > requiredSize) {
            scale = (int)Math.pow(2, (int) Math.round(Math.log(requiredSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        fis = new FileInputStream(f);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();
    } catch (IOException e) {
    }
    return b;
}
public String getPath(Uri uri,Activity act) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = act.managedQuery(uri, projection, null, null, null);
    if (cursor != null) {       
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } else
        return null;
}
public Uri getNewMediaFilePath(ContentResolver contentResolver) {
    ContentValues values = new ContentValues();

    //create the directory
    // /mnt/sdcard/DCIM/Camera/IMG_20111101_111922.jpg
    String cameraDir = "/Camera";
    //File dir1 = act.getExternalFilesDir(Environment.DIRECTORY_DCIM);
    File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()+cameraDir);
    if(!dir.exists()) dir.mkdir();

    //use date as filename
    String name = "IMG_" + (String) android.text.format.DateFormat.format("yyyyMMdd_hhmmss",new Date());
    String path = dir.getPath()+File.separator + name;
    values.put(MediaStore.MediaColumns.TITLE, name);
    values.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis());
    Uri base = null;
    path += ".jpg";
    base = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.MediaColumns.DATA, path);
    return contentResolver.insert(base, values);
}

これがお役に立てば幸いです。

于 2012-04-26T02:22:40.873 に答える