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);

这是在真实设备上运行的,索尼爱立信 Xperia Ray。它创建文件夹,并将图像保存在那里。

但问题出在模拟器上。恐怕这会在其他设备上发生。

这是日志:

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

Since your data extras method isn't working, you could try storing a field of the file or the path when the Intent is launched.

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);

So when you enter onActivityResult you can test the resultCode against RESULT_OK and RESULT_CANCELED. When I use onActivityResult, I do it like this:

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

After some help, specially from @BackpackOnHead, I got it.

What did I achieve?

  • Retrieve a picture from camera,
  • save it on a specified folder
  • save it on a specified name

This is the final code:

On declaration of the class:

File resultingFile;

When clicking the button that starts camera:

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);
        }   

Then on, onActivityResult:

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

Yay!

Why did I do it this way and not with Bitmap photo = (Bitmap) data.getExtras().get("data"); ?

Basically, because for some unknown (for me) reason, on some devices, aswel as on emulator, this .getExtras is returning null, thing that in some devices, obvioulsy, as it should, isn't returning null. This "getExtras" provided the photo. We had to use a workaround, that isn't maybe clear and clean, but it does the trick.

于 2013-01-06T23:04:58.767 回答
0

Try this:

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 回答