图像捕获后从Uri获取文件

时间:2011-07-25 17:28:30

标签: java android

我需要使用活动在相机上拍照。在我的onActivityResult中,我能够检索一个uri,但是我无法通过使用File构造函数获取此uri的文件。我的意图如下:

   Intent cameraintent = new Intent("android.media.action.IMAGE_CAPTURE");
   File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
   cameraintent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
   imageURICamera = Uri.fromFile(photo);
   startActivityForResult(cameraintent, 1);

我在onActivityResult中使用全局定义的“imageURICamera”。我认为这个问题与Uri没有正确的属性有关,因为文件构造函数的documentation声明:

“使用指定URI的路径构造一个新文件.uri必须是具有文件方案和非空路径组件的绝对和分层统一资源标识符,但具有未定义的权限,查询或片段组件”

我的onActivityResult目前看起来像这样:

 Uri u = imageURICamera;
 getContentResolver().notifyChange(u, null);
 ContentResolver cr = getContentResolver();
 Bitmap bm;
 try {
    bm = android.provider.MediaStore.Images.Media.getBitmap(cr, u);
    String path = getRealPathFromURI(u);
    File f = new File(path);

当我尝试查询contentProvider的路径时,我得到以下logcat输出:

   07-25 20:04:04.310: ERROR/AndroidRuntime(16438): FATAL EXCEPTION: main
   07-25 20:04:04.310: ERROR/AndroidRuntime(16438): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {tod.dosetracker/tod.dosetracker.ImageViewerActivity}: java.lang.NullPointerException
   07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
   07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578)
   07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at android.app.ActivityThread.access$2000(ActivityThread.java:117)
   07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)
   07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at  android.os.Handler.dispatchMessage(Handler.java:99)
   07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at       android.os.Looper.loop(Looper.java:123)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at android.app.ActivityThread.main(ActivityThread.java:3691)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at java.lang.reflect.Method.invokeNative(Native Method)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at java.lang.reflect.Method.invoke(Method.java:507)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at dalvik.system.NativeStart.main(Native Method)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438): Caused by: java.lang.NullPointerException
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at tod.dosetracker.ImageViewerActivity.getRealPathFromURI(ImageViewerActivity.java:315)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at tod.dosetracker.ImageViewerActivity.onActivityResult(ImageViewerActivity.java:251)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at  android.app.Activity.dispatchActivityResult(Activity.java:3934)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
  07-25 20:04:04.310: ERROR/AndroidRuntime(16438):     ... 11 more
  07-25 20:04:04.315: ERROR/(2696): Dumpstate > /data/log/dumpstate_app_error

2 个答案:

答案 0 :(得分:5)

您已经指定此文件应保存到您的代码中的pic.jpg

File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");

您无需再做任何其他事情。您应该能够直接使用它而不保存活动结果回调。

您可以使用图像的时间戳改进意图启动代码。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
String fileName = dateFormat.format(new Date()) + ".jpg";

// or use timestamp e.g String fileName = System.currentTimeMillis()+".jpg";

File photo = new File(Environment.getExternalStorageDirectory(), fileName);

Intent cameraintent = new Intent("android.media.action.IMAGE_CAPTURE");
cameraintent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
startActivityForResult(cameraintent, 1);

答案 1 :(得分:0)

文件构造函数不接受Uri。您必须从MediaStore内容提供商处获取实际文件位置,然后才能为该位置创建File实例。

更新:File构造函数确实采用了Uri。但我的意思是,只需要一个带有文件方案的Uri。即。任何以file://开头的东西但在这种情况下,你总会得到一个以content://开头的内容uri。这对构造函数不起作用。

检查此主题:Get/pick an image from Android's built-in Gallery app programmatically

相关问题