【问题标题】:onActivityResult RESULT_CODE always 0 (cancel)onActivityResult RESULT_CODE 始终为 0(取消)
【发布时间】:2014-05-05 15:09:04
【问题描述】:

另一个奇怪的问题。通过意图使用相机时总是得到 RESULT_CANCELLED (这是一个问题)。更多相关背景:

我在活动的 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)

【问题讨论】:

  • 值得一提:在 onClick 中删除这一行让我返回 RESULT_OK: cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
  • 可能目录“dcim”不存在,导致Intent返回RESULT_CANCELED?
  • 在文档 (developer.android.com/reference/android/content/…) 中,它说 getDir “检索,如果需要,创建一个新目录,应用程序可以在其中放置自己的自定义数据文件。”。将查看文件是否已创建。
  • 我复制粘贴了这段代码,但没有为我创建目录。调试还显示由于某种原因试图将目录创建为“app_dcim”,这很奇怪。这就是我在我的应用程序中做同样事情的方式,它工作正常:new File(context.getExternalFilesDir(null), new SimpleDateFormat("yyyyMMdd_hhmmss", Locale.getDefault()).format(new Date()) + ".jpg");
  • 谢谢。它确实适用于 getExternalFilesDir 但我的目标是使用私人存储,而不是外部卡。

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


【解决方案1】:

由于我的问题没有得到更好的解决方案,所以我自己分享一下。一世 通过在下面的方法中添加 dir.setWritable(true, false) 解决了我的问题,在 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)。我希望对某人有所帮助。

【讨论】:

    【解决方案2】:

    致 NeviQ-Or 的评论:

    如果

        dir.setWritable(true, false);
    

    不起作用,请尝试使用

        "absolute_file_path".setWritable(true, false);
    

    前者对我不起作用,但后者对我有用。

    【讨论】:

      【解决方案3】:

      我的问题是活动的主题。我尝试了所有方法,但没有任何效果,我正在使用 android 11 进行测试...所以我通过从清单中删除以下代码来修复它..

      android:theme="@style/FullscreenTheme"

      【讨论】:

        猜你喜欢
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 2015-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多