Hallo hier mal ein einfaches Beisiel mit den ich es immer bis API 29 geschafft habe auf die volle SD Karte intern oder echte externe zuzugreifen.
Unter API 30 kann ich nur noch einen Verzeichnis aus wählen und auf das dann zugreifen.
Natürlich muss das vom User am Anfang ausgewählt und bestätigt werden.
Hoffe das hilft weiter.
package com.jw.sdcard_saf_api23_extern;
import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.documentfile.provider.DocumentFile;
import com.jjoe64.graphview.series.DataPoint;
import com.jjoe64.graphview.series.LineGraphSeries;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
DocumentFile treeUrlDir;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(
this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 12345);
} else {
getSAF_Preissoin();
}
}
void getSAF_Preissoin() {
SharedPreferences TreePref = getSharedPreferences("SAF_Permission", 0);
String st = TreePref.getString("TreeURL", "");
if (!st.equals("")) {
treeUrlDir = DocumentFile.fromTreeUri(this, Uri.parse(st));
permissionOK();
} else {
startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), 42);
}
}
void permissionOK() {
String text;
DocumentFile dir1 = treeUrlDir.createDirectory("Hallo");
DocumentFile dir2 = dir1.createFile("txt", "Hallo.txt");
try {
writeTextToUri(dir2.getUri());
} catch (IOException e) {
e.printStackTrace();
}
try {
text = readTextFromUri(dir2.getUri());
} catch (IOException e) {
e.printStackTrace();
}
}
private String readTextFromUri(Uri uri) throws IOException {
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
reader.close();
return stringBuilder.toString();
}
private void writeTextToUri(Uri uri) throws IOException {
OutputStream outPutStream = getContentResolver().openOutputStream(uri);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outPutStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
writer.write("Hallo das ist ein Text");
writer.close();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 12345) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i("resultcode", "dateierstellen " + requestCode);
getSAF_Preissoin();
} else {
Toast.makeText(getApplicationContext(), "Permission Denied", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == 42) && (resultCode == RESULT_OK) && (data != null)) {
treeUrlDir = DocumentFile.fromTreeUri(this, data.getData());
SharedPreferences TreePref = getSharedPreferences("SAF_Permission", 0);
SharedPreferences.Editor TreeEd = TreePref.edit();
TreeEd.putString("TreeURL", treeUrlDir.getUri().toString());
TreeEd.commit();
permissionOK();
}
}
}
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.