アンドロイドのファイル操作がコロコロ変わる問題
情報漏洩があるたびにアプリの制作者側に変更しなければならないことが増える。ターゲットレベルを上げないと検索で出てこなくなる。ターゲットレベルをガルとアプリが動かなくなる。本来はOS側が対応するべきことをアプリ制作者側に丸投げしている。
intentの結果の受け取り方が変わったらしい。
'startActivityForResult(android.content.Intent, int)' is deprecated startActivityForResultは廃止予定です。
ラムダ式に書き換えたのとmimetypeを複数選択可能にした。
findViewById(R.id.button).setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
String[] mimeTypes ={
"text/plain",
"application/zip"};
intent.setType("*/*").putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
Intent chooserIntent = Intent.createChooser(intent, "ファイルの選択");
_launcherSelectFile.launch(chooserIntent);
});
ActivityResultLauncher<Intent> _launcherSelectFile = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
Charset cs;
String text = "";
TextView textArea = findViewById(R.id.textView);
if (result.getResultCode() == RESULT_OK) {
Intent resultData = result.getData();
if (resultData != null) {
Uri uri = resultData.getData();
}
}
});
intentから複数ファルのmimetyeの指定
String[] mimeTypes ={
"text/plain",
"application/zip"};
intent.setType("*/*").putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
uriからファイル名の取得。ファイル名を取得できるが絶対パスが取得できないので、ファイルを別の処理に渡せない。
Uri uri = resultData.getData();
String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};
String path = null;
Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(0);
}
cursor.close();
}
File file = new File(path);
System.out.println("filename:" + path);
System.out.println("filename:" + file.getPath());
getExternalStorageDirectory() This method was deprecated in API level 29.