繁体   English   中英

相机意图在某些设备中不起作用

[英]Camera Intent Not Working in Some Devices

在我的应用程序中,有一个按钮可启动相机意图并将捕获的图像保存在给定路径中。 它在Nexus 5X模拟器中可以正常运行,但是当我在S8或S9中尝试过时,它不会打开相机,也不会显示任何错误。 如何在我的应用程序中解决相机意图

private void PictureTakerAction()
    {
        Intent takePic = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if(takePic.resolveActivity(getPackageManager()) != null)
        {
            File photoFile = null;
            photoFile = CreatePhotoFile();

            if(photoFile != null)
            {
                pathToFile = photoFile.getAbsolutePath();
                Uri photoUri = FileProvider.getUriForFile(AddItemActivity.this,"com.airtechsolutions.fileprovider",photoFile);
                takePic.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                startActivityForResult(takePic,1);
            }
        }
    }

private File CreatePhotoFile()
    {
        String name = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        //File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File storageDir = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        File image = null;

        try {
            image = File.createTempFile(name ,".jpg" , storageDir);
        } catch (Exception e) {
            Log.i("File Log", "Exception: " + e.toString());
        }

        return image;
    }

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

    if (requestCode == 1)
     {
       Bitmap bitmap = BitmapFactory.decodeFile(pathToFile);
       Image.setImageBitmap(bitmap);
     }
}

您的应用程序有错误。 这是您在公共目录中写入临时文件。

储存权限

从文档中:

每个Android应用程序都在访问受限的沙箱中运行。 如果应用程序需要在其自己的沙箱之外使用资源或信息,则该应用程序必须请求适当的权限。 通过在应用清单中列出该许可,然后请求用户在运行时(在Android 6.0及更高版本上)批准每个许可,即可声明您的应用需要许可。

甚至不需要使用Internet等权限,因为它们不被视为危险。 但是,使用相机,存储设备等的许可很危险,就好像未经用户许可而授予该应用程序一样,也可能侵犯用户的隐私。

您正在做的是在公共目录中创建一个临时文件,该文件需要具有写/读权限。 在Android 6.0之前的版本中,您无需请求读取/写入权限即可进行读取/写入。 但是,如果您阅读以上内容,则说明Android 6.0及更高版本需要请求危险的权限,这说明了为什么您的代码可在某些设备上运行。

如果您只看到正在创建的临时文件,请执行以下操作,而不是将其存储在特定目录中:

String name = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
//File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//File storageDir = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

try {
    return File.createTempFile(name ,".jpg");
} catch (Exception e) {
    Log.i("File Log", "Exception: " + e.toString());
    return null;
}

另外,尝试这样做:

takePic.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

这将在专用目录中创建文件,这意味着您不需要请求存储权限。 您现在可以继续执行代码。

我已经解决了这个问题:)分两步完成

第1步:-

在我的Java文件中,我从

File storageDir = getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
File image = null;
image = File.createTempFile(name ,".jpg", storageDir);

File outputDir = getApplicationContext().getCacheDir();
File image = null;
image = File.createTempFile(name ,".jpg", outputDir);

步骤2是我更改了文件路径(res / xml / file_paths)

<Paths >
<external-path
    name = "logixtraders_images"
    path = "Pictures"/> 
</Paths>

<paths>
  <external-path
    name="external"
    path="." />
  <external-files-path
    name="external_files"
    path="." />
  <cache-path
    name="cache"
    path="." />
  <external-cache-path
    name="external_cache"
    path="." />
  <files-path
    name="files"
    path="." />
</paths>

对我来说很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM