1

写真の撮影中に問題が発生しました。

今までは、カメラ、エミュレーター、実機から問題なく写真を撮ることができました。しかし、それらの写真はデフォルトルートで保存されました。

そのルートを編集したかったので、自分で設定することができました。

私はそれをこのようにしました:

File folder = new File(Environment.getExternalStorageDirectory().toString()+"/ImagesFolder/");
            folder.mkdirs();

            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            Uri uriSavedImage=Uri.fromFile(new File(Environment.getExternalStorageDirectory().toString()+"/ImagesFolder/imatge.jpg"));
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);

            startActivityForResult(cameraIntent, 1888);

これは、実際のデバイスであるSony EricssonXperiaRayで動作しています。フォルダを作成し、そこに画像を保存します。

しかし、問題はエミュレーターにあります。これは他のデバイスでも発生するのではないかと思います。

これはlogcatです:

01-06 21:35:21.115: E/AndroidRuntime(1565): FATAL EXCEPTION: main
01-06 21:35:21.115: E/AndroidRuntime(1565): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=264032, result=-1, data=null} to activity {com.exercise.AndroidViewPager/com.exercise.AndroidViewPager.AndroidViewPagerActivity}: java.lang.NullPointerException
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3319)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3362)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.app.ActivityThread.access$1100(ActivityThread.java:141)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.os.Looper.loop(Looper.java:137)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at java.lang.reflect.Method.invokeNative(Native Method)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at java.lang.reflect.Method.invoke(Method.java:511)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at dalvik.system.NativeStart.main(Native Method)
01-06 21:35:21.115: E/AndroidRuntime(1565): Caused by: java.lang.NullPointerException
01-06 21:35:21.115: E/AndroidRuntime(1565):     at com.exercise.AndroidViewPager.MyFragmentD.onActivityResult(MyFragmentD.java:52)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:152)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.app.Activity.dispatchActivityResult(Activity.java:5293)
01-06 21:35:21.115: E/AndroidRuntime(1565):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
01-06 21:35:21.115: E/AndroidRuntime(1565):     ... 11 more

クラッシュ:

01-06 21:35:21.115: E/AndroidRuntime(1565): Caused by: java.lang.NullPointerException
01-06 21:35:21.115: E/AndroidRuntime(1565):     at com.exercise.AndroidViewPager.MyFragmentD.onActivityResult(MyFragmentD.java:52)

ここから来る:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 && resultCode == -1) { //-1 = TOT HA ANAT BE.
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        Log.d("debugging",""+photo.getHeight());
        Log.d("debugging",""+photo.getWidth());
        ((ImageView) myFragmentView.findViewById(R.id.fotoCapturada)).setImageBitmap(photo);
    }
}

その通り:

Bitmap photo = (Bitmap) data.getExtras().get("data");

いくつかの調査の後、私は明確なものは何も見つかりませんでした...

この問題について私を助けてくれませんか?

ありがとう。

4

4 に答える 4

2

data extrasメソッドが機能していないため、インテントの起動時にファイルのフィールドまたはパスを保存してみることができます。

File resultingFile;//This will be in your class definition

File folder = new File(Environment.getExternalStorageDirectory().toString()+"/ImagesFolder/");
folder.mkdirs();

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
resultingFile = new File(folder.toString() + "/image.jpg");
Uri uriSavedImage=Uri.fromFile(resultingFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);

startActivityForResult(cameraIntent, 1888);

したがって、onActivityResultを入力すると、RESULT_OKおよびRESULT_CANCELEDに対してresultCodeをテストできます。onActivityResultを使用するときは、次のようにします。

if(requestCode == 1888){
  if(resultCode == RESULT_OK){ //Called when the user saves the image
     if(resultingFile.exists(){
       Bitmap photo = BitmapFactory.decodeFile(resultingFile.getPath()); 
       ((ImageView) myFragmentView.findViewById(R.id.fotoCapturada)).setImageBitmap(photo);
     }
  }else if(resultCode == RESULT_CANCELED){ //Called when the user presses back or cancels the saving of the image

  }
}
于 2013-01-06T22:34:43.680 に答える
1

特に@BackpackOnHeadからの助けを借りて、私はそれを手に入れました。

私は何を達成しましたか?

  • カメラから写真を取得し、
  • 指定したフォルダに保存する
  • 指定した名前で保存する

これは最終的なコードです:

クラスの宣言時:

File resultingFile;

カメラを起動するボタンをクリックすると:

public void onClick(View v) {
            Log.d("debugging","Has clicat al botó");

            File folder = new File(Environment.getExternalStorageDirectory().toString()+"/FolderWithImages/"); //NAME OF THE FOLDER
            folder.mkdirs();

            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            resultingFile=new File(folder.toString() + "/imatge.jpg"); //THIS IS THE NAME OF THE FILE
            Uri uriSavedImage=Uri.fromFile(resultingFile);
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);

            startActivityForResult(cameraIntent, 1888);
        }   

次に、onActivityResult:

Bitmap photo = BitmapFactory.decodeFile(resultingFile.getPath());
        Log.d("debugging",resultingFile.getPath());
        ((ImageView) myFragmentView.findViewById(R.id.fotoCapturada)).setImageBitmap(photo);

わーい!

ではなく、なぜこのようにしたのBitmap photo = (Bitmap) data.getExtras().get("data");ですか?

基本的に、(私にとって)不明な理由により、一部のデバイスでは、エミュレーターと同様に、この .getExtras がnullを返しているため、一部のデバイスでは当然のことながら、nullを返していません。この「getExtras」が写真を提供してくれました。回避策を使用する必要がありました。これは明確でクリーンではないかもしれませんが、うまくいきます。

于 2013-01-06T23:04:58.767 に答える
0

これを試して:

File f = createImageFile();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, f.getAbsolutePath());
startActivityForResult(takePictureIntent, 1);
于 2013-01-09T20:11:57.203 に答える
-1

getExtras() は null を返すことができますが、あなたの場合はおそらくそうなります。

于 2013-01-06T21:52:50.533 に答える