3

私はこれをやっています:

intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
final File storage = Environment.getExternalStorageDirectory();
final Uri uri = Uri.fromFile(new File(storage, System.currentTimeMillis() + ".jpg"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, id);

その写真を処理するために、私はこれを行います:

private String getLastImagePath() {
    final String[] imageColumns = { MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA };
    final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
    final Cursor imageCursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns,
            null, null, imageOrderBy);
    if (imageCursor.moveToFirst()) {
        final String fullPath = imageCursor.getString(imageCursor
                .getColumnIndex(MediaStore.Images.Media.DATA));
        return fullPath;
    } else {
        throw new RuntimeException();
    }
}

ただし、次のようなメッセージが引き続き表示されます。

07-02 14:46:54.751: E/BitmapFactory(23119): Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20130702_144653.jpg: open failed: ENOENT (No such file or directory)

ギャラリーを確認すると、写真がないので、インテントがMediaStore.EXTRA_OUTPUT値を無視していると思います。

独自のカメラ ソリューションを作成する以外にできることはありますか?

4

2 に答える 2

3

次のように使用します。

意図:

             Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(takePicture, 0);

その結果を取得するには:

 protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
       super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

       switch(requestCode) {
       case 0:
           if(resultCode == RESULT_OK){
           Uri selectedImage = imageReturnedIntent.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

                   Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                   cursor.moveToFirst();

                   int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                  //file path of captured image
                   filePath = cursor.getString(columnIndex); 
                   //file path of captured image
                   File f = new File(filePath);
                   filename= f.getName();

                   Toast.makeText(SiteViewFieldCreate.this, "Your Path:"+filePath, 2000).show();
                   Toast.makeText(SiteViewFieldCreate.this, "Your Filename:"+filename, 2000).show();
                   cursor.close();

                 //Convert file path into bitmap image using below line.
                  // yourSelectedImage = BitmapFactory.decodeFile(filePath);


                  //put bitmapimage in your imageview
                  //yourimgView.setImageBitmap(yourSelectedImage);
      }
       break;
     }
    } 

これをmanifest.xmlに追加します。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />


<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

これで解決策が得られることを願っています。

于 2013-07-02T12:59:58.513 に答える
1

Nirmals ソリューションは、Android 4.x (Apilevel 15) を除くすべてのデバイスで正常に動作します。バグのようですが、imageReturnedIntent.getData()常に null を返します! (エミュレーターとデバイスのテスト) 撮影した写真は外部ディレクトリにも保存されないため、最新idまたは最高のdate_addedものを取得しようとContentResolverすると失敗します (カードから最新の写真が返されますが、撮影された写真は返されません)。現在、この問題の解決策はありません...Apilevel 15で撮影した写真のパスを取得することは不可能のようです(ドローアブルを取得して自分で保存することはまだ可能です)...

于 2014-01-07T08:28:54.390 に答える