外部SD卡许可被拒绝

问题描述

我正在尝试将文本(“ hello!”)保存到存储在外部SD卡上的文件test.txt中。每次尝试时,都会出现拒绝访问异常。我怎么了预先感谢您的任何建议。 ps。从外部SD卡读取test.txt可以。另外,我手动检查了该应用程序是否有权访问存储(已经检查了该应用程序的权限属性),但是,每次写入都失败。

更新:我正在使用: 编译版本29 targetSdkVersion 29 Android Studio 4.1


import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Build;
import android.os.Bundle;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

        String SD_path = "/storage/1619-0D07/test/test.txt";
        String string_to_save = "hello!";

        File file;
        file = new File(SD_path);
        
        byte buffer[] = new byte[0];
        try {

            buffer = string_to_save.getBytes("UTF-8");

        } catch (Exception e) {

            String msg = e.getMessage();

        }

        try {

            FileOutputStream fileOut = new FileOutputStream(file);
            fileOut.write(buffer);
            fileOut.close();

        } catch (Exception e) {

            String msg = e.getMessage();

        }       

    }
}```



```    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.askforum">

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





解决方法

步骤1:在清单中授予权限

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

第2步:在Android Manifest中编写 provider

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
 </provider>

第3步:在名为 provider_paths.xml 的XML文件夹中创建文件并编写

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="files_root"
        path="Android/data/${applicationId}" />
    <external-path
        name="external_files"
        path="." />
</paths>