如何解决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 举报,一经查实,本站将立刻删除。