Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从相机捕获的图像未显示(OnActivityResult)_Android_Android Layout_Android Intent_Android Emulator_Android Widget - Fatal编程技术网

Android 从相机捕获的图像未显示(OnActivityResult)

Android 从相机捕获的图像未显示(OnActivityResult),android,android-layout,android-intent,android-emulator,android-widget,Android,Android Layout,Android Intent,Android Emulator,Android Widget,我无法取回我刚抓到的照片。我相信我的OnActivityResult,case CAPTURE\u IMAGE\u ACTIVITY\u REQUEST\u代码有问题。按案例1从相册中检索照片效果良好。请善意的建议 源代码: protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCo

我无法取回我刚抓到的照片。我相信我的OnActivityResult,case CAPTURE\u IMAGE\u ACTIVITY\u REQUEST\u代码有问题。按案例1从相册中检索照片效果良好。请善意的建议

源代码:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        super.onActivityResult(requestCode, resultCode, data); 
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
           if(resultCode == RESULT_OK){     
             Uri targetUri = (data != null) ? data.getData() : null;
             if (targetUri == null) {
                 targetUri = fileUri;
             }
             imageView.setImageURI(targetUri);
           }
           if(resultCode == RESULT_CANCELED){   
             Uri targetUri = (data != null) ? data.getData() : null;
             if (targetUri == null) {
                 targetUri = fileUri;
             }
             imageView.setImageURI(targetUri);
           }
           else{  ; 
             Uri targetUri = (data != null) ? data.getData() : null;
             if (targetUri == null) {
                 targetUri = fileUri;
             }
             imageView.setImageURI(targetUri);
           }
    }   
    else if(requestCode == 1) {
        if(resultCode == RESULT_OK){  
            Uri selectedImage = data.getData();
            imageView.setImageURI(selectedImage);
        }
    }
}

}

您是否获得图像取决于手机制造商。每个安卓版本和每个制造商的行为似乎都略有不同。有时URL在结果中作为数据参数提供,这就是您正在做的,但有时它只是空的。我甚至有一次收到一部手机,虽然它工作得很好,但它却返回了取消的结果

似乎没有办法实现所有不同的回退。这是我的代码,我目前正在我们的一个项目中使用。需要将成员变量mTargetUri设置为作为Intent参数MediaStore.EXTRA_output提供的输出文件名,在启动Intent之前,应将mCaptureTime设置为Sytem.currentTimeMillis

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Log.v(LOG_TAG, "Camera intent succeeded");
        }
        else if (resultCode == RESULT_CANCELED) {
            Log.i(LOG_TAG, "Camera intent aborted");
        }
        else {
            Log.e(LOG_TAG, "Camera intent failed with result code: " + resultCode);
        }

        // Regardless of the resultCode we're going to check if a new photo has been
        // created on the phone. At least on the Samsung Galaxy S3 the behavior
        // could be observed that although the result code was "0" the camera app
        // created two (!) files on the SD card.

        // Image captured and saved to fileUri specified in the Intent
        Uri targetUri = (data != null) ? data.getData() : null;
        if (targetUri == null) {
            Log.w(LOG_TAG, "Camera intent returned empty result.");
            targetUri = mTargetUri;
        }

        if (targetUri != null) {
            String targetFilePath = targetUri.getPath();
            File targetFile = new File(targetFilePath);
            if (targetFile.exists()) {
                Log.i(LOG_TAG, "Image saved to: " + targetUri.toString());

                // Fix for issue reported here: http://code.google.com/p/android/issues/detail?id=22822
                // and here: http://code.google.com/p/android/issues/detail?id=19268
                // We're following the proposed solution from https://stackoverflow.com/questions/8450539/
                int rotation = -1;
                long fileSize = targetFile.length();
                Cursor mediaCursor = getContentResolver().query(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                        new String[] { 
                            MediaStore.Images.ImageColumns.ORIENTATION, 
                            MediaStore.MediaColumns.SIZE,
                            MediaStore.MediaColumns.DATA }, 
                        MediaStore.MediaColumns.DATE_ADDED + ">=?", 
                        new String[] { String.valueOf(mCaptureTime/1000 - 1)}, 
                        MediaStore.MediaColumns.DATE_ADDED + " desc");

                if ((mediaCursor != null) && (mCaptureTime != 0)) {
                    if (mediaCursor.moveToFirst()) {
                        do {
                            long size = mediaCursor.getLong(1);
                            Uri uri = Uri.parse(mediaCursor.getString(2));
                            // Extra check to make sure that we are getting the orientation from the proper file
                            if (size == fileSize && !uri.equals(targetUri.toString())) {
                                rotation = mediaCursor.getInt(0);
                                break;
                            }
                        } while (mediaCursor.moveToNext());
                    }
                    mediaCursor.close();
                }

                if (rotation == -1) {
                    // It seems that there has been no duplication and no rotation issue so far. This means we can
                    // add our newly created file to the media library.
                    // TODO
                }
                else {
                    // Looks like the picture already exists in the media library. This indicates we got a duplicate.
                    Log.w(LOG_TAG, "Duplicate image found for " + targetUri.toString() + " in media library. Deleting the copy.");
                    if (!targetFile.delete()) {
                        Log.e(LOG_TAG, "Failed to delete duplicate image.");
                    }
                }
            }
            }
    }
}
代码来源于Stackoverflow和其他站点上的不同来源。基本思想是我们

忽略结果代码result_OK或result_Cancelled,因为它们不表示照片是否已拍摄并存储在SD卡上。上面的代码只记录值,但在任何情况下都会继续。 然后我们检查意图结果是否提供了URI。如果我们得到一个URI,那么可以安全地假设它实际上会指向新拍摄的照片。然而,我们不会得到这样一个URI,尽管一切都非常成功。为了处理这种情况,我们只需使用最初提供给摄影机活动mTargetUri的URI,希望在那里找到新文件。 在一些较新的设备上,摄像头应用程序会自动将新照片添加到媒体库中,然后按照我们最初在targetUri中指定的方式创建第二个副本名称。这种方法的问题是我们最终会得到重复的图像。为了解决这个问题,我们遵循从以下Stackoverflow问题派生的逻辑:。我不会在这里详细介绍,只是按照链接来更好地理解,但基本思想是,我们查询Android media store,并通过比较时间戳来检查它是否已经包含我们的新照片。最初启动捕获意图时,mCaptureTime设置为System.currentTimeMillis。 如果我们在媒体存储中找到条目,我们只需删除副本。
这种逻辑在任何情况下都应该适用于几乎所有的Android设备。到目前为止,我们已经在十几种不同的设备和Android版本上进行了测试,没有其他问题。

您是否获得图像取决于手机制造商。每个安卓版本和每个制造商的行为似乎都略有不同。有时URL在结果中作为数据参数提供,这就是您正在做的,但有时它只是空的。我甚至有一次收到一部手机,虽然它工作得很好,但它却返回了取消的结果

似乎没有办法实现所有不同的回退。这是我的代码,我目前正在我们的一个项目中使用。需要将成员变量mTargetUri设置为作为Intent参数MediaStore.EXTRA_output提供的输出文件名,在启动Intent之前,应将mCaptureTime设置为Sytem.currentTimeMillis

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Log.v(LOG_TAG, "Camera intent succeeded");
        }
        else if (resultCode == RESULT_CANCELED) {
            Log.i(LOG_TAG, "Camera intent aborted");
        }
        else {
            Log.e(LOG_TAG, "Camera intent failed with result code: " + resultCode);
        }

        // Regardless of the resultCode we're going to check if a new photo has been
        // created on the phone. At least on the Samsung Galaxy S3 the behavior
        // could be observed that although the result code was "0" the camera app
        // created two (!) files on the SD card.

        // Image captured and saved to fileUri specified in the Intent
        Uri targetUri = (data != null) ? data.getData() : null;
        if (targetUri == null) {
            Log.w(LOG_TAG, "Camera intent returned empty result.");
            targetUri = mTargetUri;
        }

        if (targetUri != null) {
            String targetFilePath = targetUri.getPath();
            File targetFile = new File(targetFilePath);
            if (targetFile.exists()) {
                Log.i(LOG_TAG, "Image saved to: " + targetUri.toString());

                // Fix for issue reported here: http://code.google.com/p/android/issues/detail?id=22822
                // and here: http://code.google.com/p/android/issues/detail?id=19268
                // We're following the proposed solution from https://stackoverflow.com/questions/8450539/
                int rotation = -1;
                long fileSize = targetFile.length();
                Cursor mediaCursor = getContentResolver().query(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                        new String[] { 
                            MediaStore.Images.ImageColumns.ORIENTATION, 
                            MediaStore.MediaColumns.SIZE,
                            MediaStore.MediaColumns.DATA }, 
                        MediaStore.MediaColumns.DATE_ADDED + ">=?", 
                        new String[] { String.valueOf(mCaptureTime/1000 - 1)}, 
                        MediaStore.MediaColumns.DATE_ADDED + " desc");

                if ((mediaCursor != null) && (mCaptureTime != 0)) {
                    if (mediaCursor.moveToFirst()) {
                        do {
                            long size = mediaCursor.getLong(1);
                            Uri uri = Uri.parse(mediaCursor.getString(2));
                            // Extra check to make sure that we are getting the orientation from the proper file
                            if (size == fileSize && !uri.equals(targetUri.toString())) {
                                rotation = mediaCursor.getInt(0);
                                break;
                            }
                        } while (mediaCursor.moveToNext());
                    }
                    mediaCursor.close();
                }

                if (rotation == -1) {
                    // It seems that there has been no duplication and no rotation issue so far. This means we can
                    // add our newly created file to the media library.
                    // TODO
                }
                else {
                    // Looks like the picture already exists in the media library. This indicates we got a duplicate.
                    Log.w(LOG_TAG, "Duplicate image found for " + targetUri.toString() + " in media library. Deleting the copy.");
                    if (!targetFile.delete()) {
                        Log.e(LOG_TAG, "Failed to delete duplicate image.");
                    }
                }
            }
            }
    }
}
代码来源于Stackoverflow和其他站点上的不同来源。基本思想是我们

忽略结果代码result_OK或result_Cancelled,因为它们不表示照片是否已拍摄并存储在SD卡上。上面的代码只记录值,但在任何情况下都会继续。 然后我们检查意图结果是否提供了URI。如果我们得到一个URI,那么可以安全地假设它实际上会指向新拍摄的照片。然而,我们不会得到这样一个URI,尽管一切都非常成功。为了处理这种情况,我们只需使用最初提供给摄影机活动mTargetUri的URI,希望在那里找到新文件。 在一些较新的设备上,摄像头应用程序会自动将新照片添加到媒体库中,然后按照我们最初在targetUri中指定的方式创建第二个副本名称。这种方法的问题是我们最终会得到重复的图像。为了解决这个问题,我们遵循从以下Stackoverflow问题派生的逻辑:。我不会在这里详细介绍,只是按照链接来更好地理解,但基本思想是,我们查询Android media store,并通过比较时间戳来检查它是否已经包含我们的新照片。最初启动捕获意图时,mCaptureTime设置为System.currentTimeMillis。 如果我们在媒体存储中找到条目,我们只需删除副本。 这种逻辑在任何情况下都应该适用于几乎所有的Android设备。我们没有
到目前为止,它已在十几种不同的设备和Android版本上试用,没有其他问题。

试着转动相机,以横向模式拍照。Mediastore Camera Intent似乎只拍摄横向照片。

试着转动相机,以横向模式拍摄照片。似乎Mediastore Camera Intent只拍摄风景照片。

我遇到了同样的问题,一旦检查,您是否放置了与历史相关的标签

不要在清单中放置android:noHistory=true标记

如果在清单内的活动中使用android:noHistory=true,它将 停止后从堆栈中移除

注意:如果您使用的是tab活动,那么您也不应该使用android:noHistory=true


或者干脆把android:noHistory=false放在清单内的活动中。

我也遇到了同样的问题,一旦检查,你有没有放任何与历史相关的标签

不要在清单中放置android:noHistory=true标记

如果在清单内的活动中使用android:noHistory=true,它将 停止后从堆栈中移除

注意:如果您使用的是tab活动,那么您也不应该使用android:noHistory=true


或者干脆在清单内的活动中输入android:noHistory=false。

您收到任何错误或警告吗?没有。没有错误。这里的问题是我不确定这是否是我的案例代码的问题。我试过在箱子里烤面包,但也没有显示你有任何错误或警告吗?没有。没有错误。这里的问题是我不确定这是否是我的案例代码的问题。我试过在箱子里烤面包,但也没有显示出来。我想知道mCaptureTime的目的是什么,它的目的是什么?另外,您的意思是我只需要将onActvityResult的代码更改为上述代码吗?所以在我的例子中targetUri=fileUri?同样,对于我的例子来说,这不是resultcode的问题,因为我在result ok中添加了相同的代码,result Cancelled。我相信它没有为requestCode==捕获\图像\活动\请求\代码输入if语句。我可以知道这是为什么吗?有关捕获时间和检查旋转的基本逻辑源自以下Stackoverflow响应:。这也解释了它背后的想法。在我的测试中,我总是从被调用的活动中得到正确的请求代码。因此,我希望这在所有平台上都能正常工作。然而,不同设备的结果代码和附加值有很大差异。稍后,我将更新我的答案以更详细地解释这一点。您可以使用MediaStore.Images.Media.\u ID,而不用检查mCaptureTime。捕获时间在emulator上有错误。大家好,安德烈,我可以知道mCaptureTime的目的是什么吗?它的目的是什么?另外,您的意思是我只需要将onActvityResult的代码更改为上述代码吗?所以在我的例子中targetUri=fileUri?同样,对于我的例子来说,这不是resultcode的问题,因为我在result ok中添加了相同的代码,result Cancelled。我相信它没有为requestCode==捕获\图像\活动\请求\代码输入if语句。我可以知道这是为什么吗?有关捕获时间和检查旋转的基本逻辑源自以下Stackoverflow响应:。这也解释了它背后的想法。在我的测试中,我总是从被调用的活动中得到正确的请求代码。因此,我希望这在所有平台上都能正常工作。然而,不同设备的结果代码和附加值有很大差异。稍后,我将更新我的答案以更详细地解释这一点。您可以使用MediaStore.Images.Media.\u ID,而不用检查mCaptureTime。捕获时间在emulator上有错误。归功于