Danke für das Beispiel. Wenn ich es teils mit "ACTION_OPEN_DOCUMENT_TREE" in meinem TestCode umsetze, erhalte ich jetzt auch die gewünschte Nachfrage nach Ort und Zugriffsberechtigung.
Nun wird mir aber auch gesagt, dass "startActivityForResult" veraltet ist und durch einen "ActivityResultLauncher" ersetzt werden sollte. Nach ein paar Recherchen habe ich nun folgenden Code:
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
ActivityResultLauncher<Intent> temp_ActivityResultLauncher_0 = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
binding.textViewAll.setText(binding.textViewAll.getText() + "\n" +
"inside onActivityResult");
}
}
});
@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) {
// check Sdk Version
if (Build.VERSION.SDK_INT < 19) {
binding.textView1.setText("SDK Version < 19");
}
else {
binding.textView1.setText("SDK Version > 19");
binding.textViewAll.setText(binding.textViewAll.getText().toString() + "\n" +
"create intent object");
Intent temp_Intent_0 = new Intent(Intent.ACTION_CREATE_DOCUMENT);
binding.textViewAll.setText(binding.textViewAll.getText().toString() + "\n" +
"set file name text.txt");
//temp_Intent_0.putExtra(Intent.EXTRA_TITLE, "text.txt");
binding.textViewAll.setText(binding.textViewAll.getText().toString() + "\n" +
"call ActivityResultLauncher");
temp_ActivityResultLauncher_0.launch(temp_Intent_0);
}
}
Alles anzeigen
Ich beschränke mich darauf, erstmal nur einen Text darzustellen, möchte dann aber letztendlich per "FileOutputStream" eine einzelne Textdatei schreiben.
Nun ist es so, dass die App stoppt und das Logcat folgendes ausgibt:
FATAL EXCEPTION: main
Process: clthaler.appfortest, PID: 21927
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:473)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:468)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CREATE_DOCUMENT }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2067)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1727)
at android.app.Activity.startActivityForResult(Activity.java:5314)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:728)
at androidx.core.app.ActivityCompat$Api16Impl.startActivityForResult(ActivityCompat.java:809)
at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:246)
at androidx.activity.ComponentActivity$2.onLaunch(ComponentActivity.java:243)
at androidx.activity.result.ActivityResultRegistry$2.launch(ActivityResultRegistry.java:175)
at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:47)
at clthaler.appfortest.MainActivity.button1(MainActivity.java:52)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:468)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Ich erhalte auch keine Abfrage des Ortes und der notwendigen Berechtigung, wie es bei "ACTION_OPEN_DOCUMENT_TREE" der Fall war. Und wenn ich es richtig verstehe, erhält der Launcher aufgrund dessen keine Rückgabe, die von ihm verarbeitet werden kann, was dann zu diesem Fehler führt. Die Ausnahme kann ich natürlich abfangen, aber das löst natürlich nicht das Problem.
Gleiches passiert, wenn ich "ACTION_OPEN_DOCUMENT" verwende. Irgendwo ist im Code oder in meinem Verständnis ist also noch der Wurm drin.