Android外部SD卡子文件夹访问权限

问题描述

由于论坛的用户,我设法编写了一个代码,以获取对SD卡的写入权限。 我的目标是在SD卡上的“ storage / 1619-0D07 / test123”路径下创建文件。 在执行程序期间,系统会请求访问SD卡的权限。一切似乎都正常。 但是,当我尝试在文件夹“ test123”(使用OnClickListener)中创建文件时,实际上是在SD卡的根文件夹(“ storage / 1619-0D07”)中创建了文件,而不是在子文件夹“ test123”中创建了文件。 为了能够在路径为“ storage / 1619-0D07 / test123”的子目录中创建文件,我需要在程序中进行哪些更改? 预先感谢您的任何建议!

p.s。 compileSdkVersion 29,targetSdkVersion 29

package com.example.forum11_11_2020;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.documentfile.provider.DocumentFile;

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.UriPermission;
import android.net.Uri;
import android.os.Bundle;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    Uri uri;
    DocumentFile pickedDir;
    Button Button1;

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

        Button1 = new Button(MainActivity.this);
        Button1 = findViewById(R.id.button1);
        Button1.setonClickListener(onClickListener_Button1);

        takeCardUriPermission("storage/1619-0D07/test123");

    }

    public void takeCardUriPermission(String sdCardRootPath) {

        int stop=1;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            File sdCard = new File(sdCardRootPath);
            StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
            StorageVolume storageVolume = storageManager.getStorageVolume(sdCard);
            Intent intent = storageVolume.createAccessIntent(null);
            try {
                startActivityForResult(intent,4010);
            } catch (ActivityNotFoundException e) {
            }
        }
    }


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

        if (requestCode == 4010) {

            Uri uri = data.getData();

            grantUriPermission(getPackageName(),uri,Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
                    Intent.FLAG_GRANT_READ_URI_PERMISSION);

            final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
                    Intent.FLAG_GRANT_READ_URI_PERMISSION);

            getContentResolver().takePersistableuriPermission(uri,takeFlags);
        }
    }

    public Uri getUri() {
        List<UriPermission> persistedUriPermissions = getContentResolver().getPersistedUriPermissions();
        if (persistedUriPermissions.size() > 0) {
            UriPermission uriPermission = persistedUriPermissions.get(0);
            return uriPermission.getUri();
        }
        return null;
    }

    public void writeFile(DocumentFile pickedDir) {
        try {

            DocumentFile file = pickedDir.createFile("text/plain","attempt.txt");
            OutputStream out = getContentResolver().openOutputStream(file.getUri());
            String textContent = "hello!!!";

            try {

                out.write(textContent.getBytes());
                int stop=1;

            } finally {
                out.close();
            }

        } catch (IOException e) {
            throw new RuntimeException("Exception: " + e.getMessage(),e);
        }
    }


    View.OnClickListener onClickListener_Button1 = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            uri = getUri();
            pickedDir = DocumentFile.fromTreeUri(getBaseContext(),uri);
            writeFile(pickedDir);

        }
    };
}

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="157dp"
        android:layout_height="91dp"
        android:layout_marginStart="124dp"
        android:layout_marginTop="104dp"
        android:text="Button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)