0

にクラッシュするコードは、Android 7.1内部ストレージからファイルを開くことができません。コードに続いてAndroidの7.1

でAndroid 5、6しかし、そのクラッシュのために完璧に動作
Intent intent1 = new Intent(Intent.ACTION_VIEW, Uri.parse("")); 
     intent1.setDataAndType(Uri.parse("file:///" + "sdcard/path/"+fName), "application/pdf"); 
     startActivity(intent1); 

Logcat:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.amey.newunipunebuddy, PID: 19574 
       android.os.FileUriExposedException: file:///sdcard/unipunebuddy_data/timetables/Timetable.pdf exposed beyond app through Intent.getData() 
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799) 
        at android.net.Uri.checkFileUriExposed(Uri.java:2346) 
        at android.content.Intent.prepareToLeaveProcess(Intent.java:9022) 
        at android.content.Intent.prepareToLeaveProcess(Intent.java:8983) 
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1519) 
        at android.app.Activity.startActivityForResult(Activity.java:4225) 
        at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) 
        at android.app.Activity.startActivityForResult(Activity.java:4183) 
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:856) 
        at android.app.Activity.startActivity(Activity.java:4522) 
        at android.app.Activity.startActivity(Activity.java:4490) 
        at com.amey.newunipunebuddy.Timetable$DownloadTask.onPostExecute(Timetable.java:498) 
        at com.amey.newunipunebuddy.Timetable$DownloadTask.onPostExecute(Timetable.java:415) 
        at android.os.AsyncTask.finish(AsyncTask.java:660) 
        at android.os.AsyncTask.-wrap1(AsyncTask.java) 
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6145) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778) 

W/DynamiteModule:COMのローカルモジュール記述子クラス。 google.firebase.authが見つかりません。 アプリケーションが終了しました。

+0

ほとんどのAndroid搭載端末では、 '/ sdcard'という名前のパスはありません。これは、開発者が**絶対パスをハードコードする必要がある理由です**。さらに、LogCatを使用して、アプリケーションに関連付けられたJavaスタックトレースを調べます。 – CommonsWare

+0

だから、解決策は何ですか? –

+0

あなたのlogcatを投稿してください – adalPaRi

答えて

0

Android 6.0以降では、外部ストレージ(Manifest.permission.WRITE_EXTERNAL_STORAGE) - https://developer.android.com/training/permissions/requesting.htmlに書き込む権限をユーザーに求める必要があります(タイトルにもかかわらず、/ sdcardを使用して外部ストレージに書き込んでいますか?あなたはgetExternalFilesDir()を使用する必要が

+0

私は許可を求めました。 –

+0

Nexusシリーズなどの一部の電話機では、/ sdcardをユーザーデータの内部ストレージとして使用しています。これは、OSによって外部ストレージデバイスとして解釈されます。 OPはそれらの間で誤解されているかもしれません。 –

0

Google documentation on external storage

また、あなたの許可を確認してください。私は覚えていませんが、今はAndroidがアプリの起動時に許可を確認するように求めています。多分それは異なるシステムにリンクされています。 (5,6、...)

0
FileUriExposedException 

ファイルのURIを外部に公開します。誰があなたにもうこれ以上のことを許さないのか。

ファイルを提供するファイルプロバイダまたはファイルコンテンツプロバイダを使用します。

+0

どうすればいいですか?私は完全にファイルを保存することができます。しかし、開くことはできません。 –

+0

あなたも開くことができます。あなたのアプリはできます。しかし、インテントを使って別のアプリにファイルパスを転送することはできません。ファイルを提供するには、ファイルプロバイダを使用する必要があります。 – greenapps

関連する問題