【问题标题】:Android: Get photo path after capturing photo from camera throw cameraIntentAndroid:从相机拍摄照片后获取照片路径
【发布时间】:2012-10-29 11:31:28
【问题描述】:

我正在使用相机Intent打开相机:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);

现在我正在尝试获取捕获照片的路径,但它的抛出错误:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST) {
Uri uri = data.getData();
String imagePath = getRealPathFromURI(uri);
}
}

private String getRealPathFromURI(Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
// import android.support.v4.content.CursorLoader; i import this for CursorLoader
    CursorLoader loader = new CursorLoader(getApplicationContext(), contentUri, proj, null, null, null);
    Cursor cursor = loader.loadInBackground();
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

它的抛出错误是:

FATAL EXCEPTION: main
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100,     result=-1, data=Intent { act=inline-data (has extras) }} to activity  {com.xxx.xxx.BbmpActivity}: java.lang.NullPointerException

at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578)
at android.app.ActivityThread.access$2000(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)
at android.os.Handler.dispatchMessage(Handler.java:99)  
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)    
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)     
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException   
at android.content.ContentResolver.acquireProvider(ContentResolver.java:743)    
at android.content.ContentResolver.query(ContentResolver.java:256)
at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:49)
at com.pixel.bbmp.BbmpActivity.getRealPathFromURI2(BbmpActivity.java:546)
at com.pixel.bbmp.BbmpActivity.onActivityResult(BbmpActivity.java:491)  
at android.app.Activity.dispatchActivityResult(Activity.java:3908)  
at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)

我认为因为这条线它会抛出错误:

CursorLoader loader = new CursorLoader(getApplicationContext(), contentUri, proj, null, null, null);

这里我需要提供而不是 getApplicationContext() 我也尝试过这个,但直到它抛出错误:

CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null);

当我启动这个应用程序时,它会抛出一个错误:

Could not find class 'android.content.CursorLoader', referenced from method com.xxx.xxx.BbmpActivity.getRealPathFromURI

【问题讨论】:

    标签: android image android-camera android-camera-intent


    【解决方案1】:

    而不是Uri uri = data.getData();write like..

    if(data!=null){
      if (requestCode == CAMERA_REQUEST) {  
               Uri uri =  data.getExtras().get("data"); 
             //or...
         Bitmap bitmapPicture = (Bitmap) data.getExtras().get("data"); 
         // other code
    }
    }
    

    它会正常工作的。主要是data.getExtras().get("data");

    【讨论】:

    • 其显示错误:类型不匹配:无法从 Object 转换为 Uri for Uri uri = data.getExtras().get("data");如果我写位图 bitmapPicture = (Bitmap) data.getExtras().get("data");那么我如何将 uri 作为参数发送给 getRealPathFromURI 方法
    • 你可以压缩位图,然后以字节形式发送到流中
    • 我的问题是如何获得路径。 uri uri = data.getExtras().get("data");这一行抛出错误。这是类型不匹配:无法从 Object 转换为 Uri
    • 换行:Uri uri = data.getExtras().get("data");在 logcat 中它抛出错误: java.lang.RuntimeException: 失败交付结果 ResultInfo{who=null, request=100, result=-1, data=Intent { act=inline-data (has extras) }} 到活动 {com .xxx.xxx/com.xxx.xxx.BbmpActivity}:java.lang.ClassCastException:android.graphics.Bit
    • 作为参数传递给 onActivityResult() 的意图数据对象可以为空,即使相机拍摄了照片并将其保存到存储中。这是一个皮塔饼。有很多关于此的帖子,包括至少一个向 Google/Android 报告的错误,因为有些人(比如我)认为这是一个错误,而不是疏忽。您会(并且应该)期望相机会告诉您在哪里可以找到刚刚拍摄的照片,否则您怎么能使用它呢?很蹩脚。
    【解决方案2】:
    CursorLoader loader = new CursorLoader(getApplicationContext(), 
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
    proj, null, null, null);
    

    【讨论】:

    • @HowardPautz:你知道为什么原来的问题被删除了吗?
    • 对不起,我不记得它说的关于死链接的内容 - 只是在清理。我遇到这个是因为三星设备没有从 /storage/sdcard0 读取文件...
    【解决方案3】:

    您可以在设置捕获意图之前指定一个 URI:

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mCameraFile));
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    

    mCameraFile 是我创建的文件:

    this.mCameraFile = File.createTempFile("toto", "jpg", fAlbum);
    

    其中 fAlbum 是一个代表我的专辑文件夹的文件:

    this.fAlbum = Environment.getExternalStorageDirectory() + "/dcim/" + "tata";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2013-01-20
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多