Moin alle zusammen,
Im Rahmen einer App Entwicklung/Erweiterung möchte ich gerne durch den Nutzer eingegebene Daten, die bisher im internalStorage landen, als Backup in den externalStorage schreiben, so dass diese dann ggf. auch wieder importiert werden können. Nun ist das Thema externalStorage und damit verbundene Lese-/Schreibrechte recht neu für mich und offenbar auch etwas komplexer, als ich dachte (erste Versuche waren jedenfalls nicht erfolgreich). Daher habe ich beschlossen, bei Null anzufangen und mich stückweise dem eigentlichen Ziel zu nähern - hoffentlich mit eurer lehrreichen Unterstützung. Zum Testen habe ich mir eine einfache GUI mit mehreren Buttons und Textzeilen erstellt, so dass ich auf Knopfdruck diverse Aktionen auslösen kann (später dann das Lesen und Speichern von Dateien).
Der erste Schritt für mich ist, die Lese- und Schreibrechte abzufragen und zu setzen.
Dazu das Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppForTest"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Alles anzeigen
Und hier der Java Code:
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
public void button1(View view) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
binding.textViewAll.setText(binding.textViewAll.getText() + "\nWrite Permission already granted");
}
else {
binding.textViewAll.setText(binding.textViewAll.getText() + "\nWrite Permission denied.");
if (Build.VERSION.SDK_INT >= 23) {
binding.textViewAll.setText(binding.textViewAll.getText() + "\nRequest Write Permission.");
requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 100:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
binding.textViewAll.setText(binding.textViewAll.getText() + "\nWrite Permission granted by user");
}
else if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_DENIED) {
binding.textViewAll.setText(binding.textViewAll.getText() + "\nWrite Permission denied by user");
}
else {
binding.textViewAll.setText(binding.textViewAll.getText() + "\nPermission Request canceled by user");
}
break;
}
}
public void button2(View view) {}
public void button3(View view) {}
public void button4(View view) {}
public void button5(View view) {}
}
Alles anzeigen
Hier nun mein erster Stolperstein:
Bei Erstinstallation der App (Android Emulator in Android Studio mit der API 30/Android 11) wird auf Anfrage auch brav die Permission abgefragt und gesetzt. Aber unabhängig davon, wie der User diese setzt, findet auf Anfrage keine erneute Abfrage statt! Es sei denn, ich ändere die Rechte per Hand über die Android-Einstellungen. Eine Option "nicht mehr fragen" erscheint erst gar nicht. Bei "requestPersmissions()" würde ich eigentlich stets den entsprechenden Abfragedialog von Android erwarten. Aktuell könnte ich den User nur auffordern, dies bei Bedarf manuell in den Einstellungen zu ändern, was aber etwas ineffizient anmutet ... habe ich hier einen Fehler im Code oder nur einen Denkfehler?