質問: new intent(intent.action_view); intent.setdataandtype(uri.fromfile(file), "text/*"); intent.setflags(intent.flag_activity_new_task); startactivity(intent); // crashes on this line ログ: android.os.fileuriexposedexception:file:///storage/emulated/0/test.txtがintent.getdata()によってアプリを超えて公開されている 編集: android nougatをターゲットにしている場合、file:// uriはもう許可されません。代わりにcontent:// uriを使うべきです。ただし、私のアプリはルートディレクトリのファイルを開く必要があります。何か案は?
回答: 私の解決策は、uri.fromfile()を使用する代わりに、文字列としてファイルパスを 'uri.parse'することでした。string storage = environment.getexternalstoragedirectory().tostring() + "/test.txt"; file file = new file(storage); uri uri; if (build.version.sdk_int < 24) { uri = uri.fromfile(file); } else { uri = uri.parse(file.getpath()); // my work-around for new sdks, causes activitynotfoundexception in api 10. } intent viewfile = new intent(intent.action_view); viewfile.setdataandtype(uri, "text/plain"); startactivity(viewfile); fromfile()がファイルポインタを使用しているように見えます。メモリアドレスがすべてのアプリケーションに公開されている場合は安全でない可能性があります。しかし、ファイルパスstringは誰にも害を与えないので、fileuriexposedexceptionをスローせずに機能します。apiレベル9〜27でテスト済み別のアプリで編集するためにテキストファイルを正常に開きます。 fileproviderもandroidサポートライブラリもまったく必要としません。