2016-11-10 20 views
-2

アセットフォルダからpdf(a.pdf)を開くときに問題があります。これはlogcatあるアセットからPDFを開くときに問題が発生する

package com.tischer.alessandro.ecocardiochecklist; 


import android.content.Context; 
import android.content.Intent; 
import android.content.res.AssetManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

public class Bibliografia extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_bibliografia); 
     AssetManager assetManager = getAssets(); 

     InputStream in = null; 
     OutputStream out = null; 
     File file = new File(getFilesDir(), "a.pdf"); 
     try 
     { 
      in = assetManager.open("a.pdf"); 
      out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); 

      copyFile(in, out); 
      in.close(); 
      in = null; 
      out.flush(); 
      out.close(); 
      out = null; 
     } catch (Exception e) 
     { 
      Log.e("tag", e.getMessage()); 
     } 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(
       Uri.parse("file://" + getFilesDir() + "/a.pdf"), 
       "application/pdf"); 

     startActivity(intent); 
    } 

    private void copyFile(InputStream in, OutputStream out) throws IOException 
    { 
     byte[] buffer = new byte[1024]; 
     int read; 
     while ((read = in.read(buffer)) != -1) 
     { 
      out.write(buffer, 0, read); 
     } 
    } 

} 

: ティは、Javaコードで

11/10 11:52:42: Launching app 
Cold swapped changes. 
$ adb shell am start -n "com.tischer.alessandro.ecocardiochecklist/com.tischer.alessandro.ecocardiochecklist.SplashScreen" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER 
Client not ready yet..Waiting for process to come online 
Connected to process 3259 on device Nexus_5X_API_24 [emulator-5554] 
I/InstantRun: Instant Run Runtime started. Android package is com.tischer.alessandro.ecocardiochecklist, real application class is null. 

       [ 11-10 10:52:44.162 1489: 1510 D/   ] 
       HostConnection::get() New Host Connection established 0x8d361440, tid 1510 
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
W/gralloc_ranchu: Gralloc pipe failed 

        [ 11-10 10:52:45.193 3259: 3259 D/   ] 
        HostConnection::get() New Host Connection established 0x9d027140, tid 3259 


        [ 11-10 10:52:45.239 3259: 3278 D/   ] 
        HostConnection::get() New Host Connection established 0x9d0d6d40, tid 3278 
I/OpenGLRenderer: Initialized EGL, version 1.4 
D/OpenGLRenderer: Swap behavior 1 
D/OpenGLRenderer: endAllActiveAnimators on 0x90937d80 (RippleDrawable) with handle 0x9d07eb80 
E/tag: MODE_WORLD_READABLE no longer supported 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.tischer.alessandro.ecocardiochecklist, PID: 3259 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tischer.alessandro.ecocardiochecklist/com.tischer.alessandro.ecocardiochecklist.Bibliografia}: android.os.FileUriExposedException: file:///data/user/0/com.tischer.alessandro.ecocardiochecklist/files/a.pdf exposed beyond app through Intent.getData() 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6077) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
        Caused by: android.os.FileUriExposedException: file:///data/user/0/com.tischer.alessandro.ecocardiochecklist/files/a.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:8933) 
         at android.content.Intent.prepareToLeaveProcess(Intent.java:8894) 
         at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517) 
         at android.app.Activity.startActivityForResult(Activity.java:4224) 
         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:4507) 
         at android.app.Activity.startActivity(Activity.java:4475) 
         at com.tischer.alessandro.ecocardiochecklist.Bibliografia.onCreate(Bibliografia.java:48) 
         at android.app.Activity.performCreate(Activity.java:6664) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
         at android.app.ActivityThread.-wrap12(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:154)  
         at android.app.ActivityThread.main(ActivityThread.java:6077)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  

私は、Android 7.0実行しているんだけど、古いバージョンでも、アプリがクラッシュ...が問題どこにありますか?

+0

*どこに問題がありますか?* FileUriExposedException - 自明の例外のように見えます...何度も尋ねられています...明白な解決策はFileProviderを使用することです – Selvin

+0

申し訳ありませんが、私はアンドロイド開発で新しくなりました...私はコードで変更する必要があることを理解できません...あなたは私を助けることができますか? –

+0

FileUriExposedExceptionでインターネット検索を行います – Selvin

答えて

0

他のアプリケーションがアクセスできないアプリケーションのプライベートディレクトリにファイルをコピーします。そして、あなたは別のアプリケーションでこのファイルを開こうとします(アプリケーションのプライベートディレクトリからそのファイルにアクセスすることはできません)。この問題を解決するには

、あなたはいくつかのオプションがあります。

  1. コピーし、いくつかの公共のディレクトリにファイル、Environment.getExternalStorageDirectory()
  2. などを第一の方法は簡単です、あなたのアプリでContentProvider

を実装し、私がそれをしていたら、私はこの方法で行くだろう。
第2の方法はが正しいですが、明らかに私にとっては過熱です。

+0

コンテンツプロバイダを実装したいと思っています。私はこのアプリケーションを作成しているので、学習したいので、可能な限り上手くやりたいと思っています。コンテンツプロバイダを挿入するのを手伝ってもらえますか? –

+0

私はこれを見つけました:[link](http://stackoverflow.com/a/21063373/7123499)、それは素晴らしいと思われますが、それは私のために働いていません... –

+0

@AlessandroTischer、私はそれをすることができましたあなたの質問トピックと完全に一致しません。あなたは新しい質問をするべきだと思います。しかし、まずインターネット上のコンテンツプロバイダーに関する教訓があり、レッスンの1つからコードをコピーして貼り付ける必要はありませんから、そのことについてはgoogleにご連絡ください。 –

関連する問題