Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.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 在Oneplus中从相机拍照时应用程序在后台崩溃_Android_Android Camera - Fatal编程技术网

Android 在Oneplus中从相机拍照时应用程序在后台崩溃

Android 在Oneplus中从相机拍照时应用程序在后台崩溃,android,android-camera,Android,Android Camera,我正在开发一个应用程序,具有从相机或画廊拍摄图像的功能。这在所有设备中都可以正常工作,但在OnePlus中却不行 代码如下: public File dispatchTakePictureIntent(Activity activity) { File tempPhotoFile = null; Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (t

我正在开发一个应用程序,具有从相机或画廊拍摄图像的功能。这在所有设备中都可以正常工作,但在OnePlus中却不行

代码如下:

public File dispatchTakePictureIntent(Activity activity) {
        File tempPhotoFile = null;
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {

            try {
                tempPhotoFile = Utils.createImageFile(activity);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (tempPhotoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(activity, Utils.getFileProvider(activity), tempPhotoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                takePictureIntent.setClipData(ClipData.newRawUri("", photoURI));
                takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                activity.startActivityForResult(takePictureIntent, Constants.REQUEST_IMAGE_CAPTURE);
            }
        }
        return tempPhotoFile;
    }
UTIL中的代码:

public static File createImageFile(Context context) throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        return image;
    }

现在,该应用程序在其他设备上运行良好。但在OnePlus中,当相机打开,我们单击图像并显示预览时,在logcat中,我们看到应用程序显示为死机,并重新启动,然后在应用程序主页屏幕上打开。当我们从打开相机应用程序的特定选项卡转到该选项卡时,我们可以看到状态已保存,并在同一页面上着陆。我们如何解决这个问题?

您可能没有为您的URI授予权限

请研究一下

编辑片段对您来说最重要的是

在startActivityForResult之前的某个地方,您需要添加

 activity.grantUriPermission(activity.getActivityInfo().getPackageName(), photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION)
这是伪代码,所以请检查一下

编辑2:我错误地建议您需要将该权限添加到您自己的包中。你需要将它添加到为你制作图片的应用程序中

以下是kotlin代码,用于捕获所有可以执行此操作的应用程序

val resInfoList = activity.packageManager.queryIntentActivities(Intent(MediaStore.ACTION_IMAGE_CAPTURE), PackageManager.MATCH_DEFAULT_ONLY)
    resInfoList
            .map { it.activityInfo.packageName }
            .forEach { this.grantUriPermission(it, photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION) }
对于图像捕获,您也可以使用更简单的意图

    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
            startActivityForResult(takePictureIntent, PICK_CAMERA_CODE)

干杯

我在OP7Pro上测试了你的代码

以下是我用于测试的代码:

@Throws(IOException::class)
fun createImageFile(context: Context): File {
    // Create an image file name
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(Date())
    val imageFileName = "JPEG_" + timeStamp + "_"
    val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)

    // Save a file: path for use with ACTION_VIEW intents
    return File.createTempFile(
        imageFileName, /* prefix */
        ".jpg", /* suffix */
        storageDir      /* directory */
    )
}

private fun dispatchTakePictureIntent(activity: Activity): File? {
    var tempPhotoFile: File? = null
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (takePictureIntent.resolveActivity(activity.packageManager) != null) {

        try {
            tempPhotoFile = createImageFile(activity)
        } catch (e: Exception) {
            e.printStackTrace()
        }

        if (tempPhotoFile != null) {
            val photoURI = FileProvider.getUriForFile(
                activity,
                applicationContext.packageName + ".fileprovider",
                tempPhotoFile
            )
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
            takePictureIntent.clipData = ClipData.newRawUri("", photoURI)
            takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION)
            activity.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
        }
    }
    return tempPhotoFile
}
然后,像这样称呼它:

btnOpenCamera.setOnClickListener{
     val r = dispatchTakePictureIntent(this)
     imageView.setImageDrawable(Drawable.createFromPath(r?.path))
}
我已经在imageview中设置了结果

文件提供程序:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>
不必等待相机拍摄照片并返回结果。 调用
活动时,它会立即返回路径。startActivityForResult(TakePictureContent,REQUEST\u IMAGE\u CAPTURE)
完成后,图像文件在返回值时可能尚未创建。因此,这种行为是不可预测的

要确保已捕获图像,应使用onActivityResult 并从意图中获取数据。我在其他手机上也发现了与你的代码相同的行为。我希望我已经把问题解释清楚了

至于你的应用程序崩溃的原因,可能你正试图对它从
DispatchTakePictureContent
返回的文件进行处理,而当你试图处理它时,图像实际上并没有在那时创建。因此,
无法打开内容:file:///storage/emulated/0/Android/data/...

这是假设,您尝试像我一样使用该文件作为图像

是您可能希望查看的示例实现

希望这有帮助

问候


Priyabrata只需在清单文件的活动标记中添加以下属性

android:requestLegacyExternalStorage="true"

指向Android 10的应用程序,上面的标志默认为false。我们必须将其设置为true

崩溃后日志以识别问题请避免发布不完整的代码,其他人需要编写部分代码:Utils、常量以运行代码。此外,请提供日志猫中的崩溃日志。不会显示与应用程序相关的日志。应用程序刚刚重新启动。@Priyabrata在中添加了代码Utils@ParthAnjaria您找到解决方案了吗?已获得许可。已在应用程序设置页面中选中。您需要在代码中调用它,就像FileProvider文档中描述的那样,就像我给您写的那一小段代码一样。是的,我理解这一点,并且代码已经编写好了。摄像头应用程序打开,当我单击图像时,后台的应用程序重新启动且不会崩溃。没有崩溃日志。代码中没有。在activity.startActivityforresult之前添加代码后,没有尝试使用“grantUriPermission”的行。仍然不起作用。如果这就是问题所在,那么它不应该在所有的手机上都起作用,对吗?
return tempPhotoFile 
android:requestLegacyExternalStorage="true"