当前位置: 首页 > 知识库问答 >
问题:

Android:授予在存储中写入的运行时权限,但仍被拒绝(例如onRequestPermissionsResult)

温开畅
2023-03-14

我想使用公共外部存储在设备中写入映像。因此,我有1)在清单中写入权限标签,2)在需要时使用check SelfPersion请求权限。但我仍然有这个例外:java.io.FileNotFoundException: /storage/emulated/03b3d97bd-5186-4506-97dc-9994b7ce0761(权限拒绝)

为什么?我已经读过了https://developer.android.com/guide/topics/permissions/overview#normal-很危险,但这不能回答我的问题。

我已授予Android设备的存储权限。因此,我的条件if(permissionCheck!=PackageManager.PERMISSION\u grated){(见下文)未正确执行,但其条件else是正确的。此条件else包含一行用于将文件保存在存储器中:但它返回此异常。。。

如果用户已授予权限,则可以调用saveImageAndShareIt。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

通常,由于具有写入权限,读取的应该被隐式识别。

下面是onRequest estPermissionsResult方法。如果用户接受授予权限,则调用saveImageAndShareIt

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    System.out.println("onrequestPR");

    if (grantResults.length > 0) {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            System.out.println("onrequestPR accepted");
            saveImageAndShareIt();
        }
    }
}

onRequest estPermissionsResultRequest estPerments调用,如下所示:

if (Build.VERSION.SDK_INT >= 23) {
    int permissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    } else {
        System.out.println("last_case1");
        saveImageAndShareIt();
        System.out.println("last_case2");
    }
} else {
    System.out.println("peperoni");
    saveImageAndShareIt();
    System.out.println("pizza");
}

因此,如果用户已经授予了权限,则无需调用Request estPerments,因此直接调用saveImageAndShareIt(换句话说:onRequest estPermissionsResult不需要执行调用saveImageAndShareIt)。

异常由FileOutputStream实例化引发。

private void saveImageAndShareIt() {
    OutputStream output;
    try {
        System.out.println("siasi1");
        output = new FileOutputStream(Environment.getExternalStorageDirectory() + image_uuid);
        byte[] buffer = new byte[1024];
        int bytesRead;
        BitmapDrawable bitmapDrawable = (BitmapDrawable) temp.getDrawable();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmapDrawable.getBitmap().compress(Bitmap.CompressFormat.JPEG, 100, stream);
        byte[] imageInByte = stream.toByteArray();
        ByteArrayInputStream bis = new ByteArrayInputStream(imageInByte);
        while ((bytesRead = bis.read(buffer, 0, buffer.length)) >= 0) {
            output.write(buffer, 0, bytesRead);
        }
        output.close();
        System.out.println("siasi2");
        intent_share.putExtra(Intent.EXTRA_STREAM, Uri.parse(Environment.getExternalStorageDirectory() + image_uuid));
        activity.startActivity(Intent.createChooser(intent_share, "Share to"));
        System.out.println("siasi3");
    } catch(IOException e) {
        e.printStackTrace();
    }
}

带系统。错误:java。io。FileNotFoundException:/storage/simulated/03b3d97bd-5186-4506-97dc-9994b7ce0761(权限被拒绝),带系统。错误:在java。io。FileOutputStream。java上的open0(本机方法)。io。FileOutputStream。打开(FileOutputStream.java:287),带系统。错误:在java。io。FileOutputStream。(FileOutputStream.java:223)带系统。错误:在java。io。FileOutputStream。(FileOutputStream.java:110)位于com。实例ClipboardDialogFragment。saveImageAndShareIt(ClipboardDialogFragment.java:115)位于com。实例ClipboardDialogFragment。使用系统访问300美元(ClipboardDialogFragment.java:42)。错误:位于com。实例剪贴板对话框片段$1$2$1。onTaskCompleted(ClipboardDialogFragment.java:75),带系统。错误:位于com。实例下载ImageTask。com上的onPostExecute(DownloadImageTask.java:34)。实例下载ImageTask。onPostExecute(DownloadImageTask.java:10),带系统。错误:在android上。操作系统。异步任务。在android上完成(AsyncTask.java:695)。操作系统。异步任务-wrap1(未知源:0)带系统。错误:在android上。操作系统。AsyncTask$InternalHandler。handleMessage(AsyncTask.java:712),带系统。错误:在android上。操作系统。处理程序。android上的dispatchMessage(Handler.java:105)。操作系统。活套。android上的loop(Looper.java:164)。应用程序。ActivityThread。main(ActivityThread.java:6944)带系统。错误:在java。lang.reflect。方法在com上调用(本机方法)。Android内部的操作系统。受精卵$MethodandArgscaler。在com上运行(zyote.java:327)。Android内部的操作系统。合子岩。main(ZygoteInit.java:1374)

共有1个答案

丁雅惠
2023-03-14

即使授予文件权限,您也无法访问SD卡和其他可移动媒体。如果我没有记错,因为KitKat,除非用户在内置文档应用程序中启用了访问权限。

您需要使用DocumentsProvider或通过StorageVolume获得另一个权限/uri,并使用DocumentsContract(示例项目)对其进行解析。

编辑:基于您的异常:

 /storage/emulated/03b3d97bd-5186-4506-97dc-9994b7ce0761

默认的外部目录是存储/模拟/0,看起来您忘记在目录名后添加分隔符了:

output = new FileOutputStream(Environment.getExternalStorageDirectory() +"/"+ image_uuid);
 类似资料:
  • 我在清单中添加了对外部存储设备的写访问权限,并在我的Android手机中授予了这些权限。如果他们不存在,我甚至会在执行时要求他们。 然而,我总是得到这个例外: Java语言io。FileNotFoundException:/storage/simulated/03b3d97bd-5186-4506-97dc-9994b7ce0761(权限被拒绝) 你知道为什么吗? 在清单文件中:

  • 我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?

  • 在这一点上我得到了警告: 如何让它保存文件?当我在Eclipse上创建它时,这是可行的,但是现在我更新并移到了Android Studio中,它似乎坏了一些东西。

  • 我正在尝试为我的Android应用程序请求运行时权限。这是我的代码: 在我的AndroidManifest中。xml: 但是,上面的代码始终显示权限被拒绝,而不提示用户请求权限。有什么想法吗? 谢谢

  • 我分配一个角色权限来创建数据库。相同的角色被分配给登录用户,但是当我试图使用分配角色的登录用户创建新数据库时,我得到权限拒绝错误。 无法执行语句。权限拒绝,数据库主,所有者dbo。运行此命令需要以下权限:CREATE DATABASE。赛贝斯错误代码=10331严重级别=14,状态=3,事务状态=0第1行 我用15.5分和16分试了一下。我做错什么了吗?我们需要考虑其他参数吗?我经历了这次讨论 h

  • 我试图保存一个csv文件到我的手机和我的目标SDK级别是26,所以我试图检查运行时的权限,而运行我的应用程序。尽管我在清单文件中赋予了必要的权限,但在检查此权限的活动中返回false。我怎么才能修好这个? 清单文件的开始 活动的相关部分如下