2014-05-05 20 views
0

另一个奇怪的问题。在通过意图处理相机时始终获取RESULT_CANCELLED(这是一个问题)。更多相关背景:onActivityResult RESULT_CODE始终为0(取消)

我的活动的onCreate分配setOnClickListener到ImageView的:

this.imSnapshot.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri()); 
     startActivityForResult(cameraIntent, CAMERA_REQUEST); 
    } 
}); 

getImageUri方法的代码:

private Uri getImageUri() { 
    ContextWrapper cw = new ContextWrapper(this); 
    File dir = cw.getDir("dcim", Context.MODE_PRIVATE); 
    File file = new File(dir, UUID.randomUUID().toString()+".png"); 
    Uri imgUri = Uri.fromFile(file); 
    Log.d("DetailsModify.getImageUri", imgUri.toString()); 
    return imgUri; 
} 

下面是onActivityResult(日志行总是返回0):

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA_REQUEST) { 
     Log.d("DetailsModify", "onActivityResult code " + resultCode); 
     if (resultCode == RESULT_OK) { 

更新:错误被IDE过滤,所以我没有注意到它原来:

CameraActivity:Saved image not found 
     java.io.FileNotFoundException 
     at android.os.Parcel.openFileDescriptor(Native Method) 
     at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:119) 
     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:481) 
     at android.content.ContentResolver.openOutputStream(ContentResolver.java:365) 
     at android.content.ContentResolver.openOutputStream(ContentResolver.java:341) 
     at com.sonyericsson.android.camera.CameraActivity.copyContentToExtraOutputUri(CameraActivity.java:1680) 
     at com.sonyericsson.android.camera.CameraActivity.setResult(CameraActivity.java:1639) 
     at com.sonyericsson.android.camera.view.CameraWindow.onStoreComplete(CameraWindow.java:1405) 
     at com.sonyericsson.android.camera.PhotoController.onStoreComplete(PhotoController.java:879) 
     at com.sonyericsson.android.camera.TakenStatus.notifyComplete(TakenStatus.java:83) 
     at com.sonyericsson.android.camera.ImageManager$StoreDataHandler.handleMessage(ImageManager.java:960) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:138) 
     at android.app.ActivityThread.main(ActivityThread.java:3701) 
     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:878) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
     at dalvik.system.NativeStart.main(Native Method) 
+0

值得一提:在onClick中删除此行让我回来RESULT_OK: cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,getImageUri()); –

+0

也许目录“dcim”不存在,从而导致意图返回RESULT_CANCELED? – ashishduh

+1

在文档(http://developer.android.com/reference/android/content/ContextWrapper.html)中,它表示getDir“检索,如果需要,创建一个新的目录,应用程序可以在其中放置自己的自定义数据文件。” 。将看看文件是否被创建。 –

回答

0

因为我还没有收到任何更好的解决方案,我的问题,分享我自己的。我 作了下面通过加入dir.setWritable(真,假)到方法,对API10测试解决我的问题:

private Uri getImageUri() { 
    ContextWrapper cw = new ContextWrapper(this); 
    File dir = cw.getDir("dcim", Context.MODE_PRIVATE); 
    dir.setWritable(true, false); 
    File file = new File(dir, UUID.randomUUID().toString()+".png"); 
    Uri imgUri = Uri.fromFile(file); 
    Log.d("DetailsModify.getImageUri", imgUri.toString()); 
    return imgUri; 
} 

它所做的是它设置权限允许相机写入应用程序的专用位置(更信息在http://developer.android.com/reference/java/io/File.html#setWritable%28boolean,%20boolean%29)。我希望能帮助别人。

0

要NeviQ-Or的评论:

如果

dir.setWritable(true, false); 

不行,请尝试使用

"absolute_file_path".setWritable(true, false); 

前者并没有为我工作,但后者没有。