问题描述
由于论坛的用户,我设法编写了一个代码,以获取对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 (将#修改为@)