在外部存储上创建新文件时权限被拒绝

Dan*_*ali 9 file-io android

我需要将文件从资产复制到外部存储.这是我的代码:

    File f = new File(Environment.getExternalStorageDirectory() + File.separator
            + "MyApp" + File.separator + "tessdata" + File.separator + "eng.traineddata");
    if (!f.exists()) {
    AssetManager assetManager = getAssets();
    try {
        f.createNewFile();
        InputStream in = assetManager.open("eng.traineddata");
        OutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory() + File.separator
            + "MyApp" + File.separator  + "tessdata" + File.separator + "eng.traineddata");
        byte[] buffer = new byte[1024];
        int read;
            while ((read = in.read(buffer)) != -1)
                    out.write(buffer, 0, read);
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        } catch (IOException e) {
            Log.e("tag", "Failed to copy asset file: ", e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我还在表格中加入了许可

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

执行时发生异常f.createNewFile(),说"权限被拒绝".

我该怎么办呢?

M. *_*han 32

在我的情况下,这是由于API 23+所需的权限弹出窗口,即使您已在清单中添加了权限.

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序启动或您需要权限时调用此函数.

AndroidManifest.xml中

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

可以在此处找到权限的详细示例代码.


Ish*_*aan 25

最近在 API 级别 29 中,他们更改了访问外部存储的方式。如果您尝试访问公共文件夹(即下载),它将抛出权限被拒绝错误。

您需要在清单文件中的应用程序标签中指定以下代码。

android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)

或者您可以将文件保存在根目录中以避免此错误。


o0r*_*s0o 8

f.mkdirs()之前f.createNewFile().您可能正在尝试在不存在的目录中创建新文件

  • 在这种情况下,您会收到文件不存在错误,但权限未被拒绝。 (3认同)
  • 该死的!!我很蠢......你是对的,谢谢你! (2认同)