2017-04-08 9 views
0

私のアプリケーションには、クリックするとPDFが開きます( "Open with"プロンプトが表示されます)というボタンがあります。 PDFファイルはアプリの私のアセットフォルダにあります。 AsyncTaskがassetsフォルダから外部ストレージにコピーしてから開くという操作を実行するようなコードを書いています。ただし、AsyncTaskクラスのメソッドは実行されていないので、Logcatから見ることができます。私は他の同様の質問を見て、その異なった答え試してみました:AsyncTaskのメソッドはありません

  1. .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)の代わりに、.executeを()
  2. .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR、(ボイド[])はnull); onPreExecute()

を追加

  • 私が手にエラーがすなわち、ファイルが見つからない、onPostExecute(ファイルファイル)メソッドでNullPointerExceptionがあります。 3つのメソッドのログされたステートメントはlogcatにありません。

    私は、以下の方法を実行これを呼び出す:ファイル

    protected void onPostExecute(File file) { 
        super.onPostExecute(file); 
    
        Context context = contextWeakReference.get(); 
    
    
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setDataAndType(
          Uri.fromFile(file), 
          "application/pdf"); 
    
        context.startActivity(intent); 
    
    } 
    

    ので

    あなたは常にdoInBackgroundにnullを返し

    Context context = contextWeakReference.get(); 
        if (context != null) { 
         new CopyFileAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[])null); 
        } 
    
    } 
    
    
    private class CopyFileAsyncTask extends AsyncTask<Void, Void, File> { 
    
    
        final String appDirectoryName = BuildConfig.APPLICATION_ID; 
        final File fileRoot = new File(Environment.getExternalStoragePublicDirectory(
          Environment.DIRECTORY_DOCUMENTS), appDirectoryName); 
    
        @Override 
        protected void onPreExecute() { 
         super.onPreExecute(); 
         Log.e("AsyncTask", "onPreExecute"); 
        } 
    
        @Override 
        protected File doInBackground(Void... params) { 
    
         Context context = contextWeakReference.get(); 
    
         AssetManager assetManager = context.getAssets(); 
    
         File file = new File(fileRoot, fileName); 
    
         InputStream in = null; 
         OutputStream out = null; 
         try { 
    
          file.mkdirs(); 
    
          if (file.exists()) { 
           file.delete(); 
          } 
    
          file.createNewFile(); 
    
    
          in = assetManager.open(fileName); 
          Log.d(TAG, "In"); 
    
          out = new FileOutputStream(file); 
          Log.d(TAG, "Out"); 
    
          Log.d(TAG, "Copy file"); 
          copyFile(in, out); 
    
          Log.d(TAG, "Close"); 
          in.close(); 
    
          out.flush(); 
          out.close(); 
    
          return file; 
         } catch (Exception e) 
         { 
          Log.e(TAG, e.getMessage()); 
         } 
    
         return null; 
        } 
    
        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); 
         } 
        } 
    
        @Override 
        protected void onPostExecute(File file) { 
         super.onPostExecute(file); 
    
         Context context = contextWeakReference.get(); 
    
    
         Intent intent = new Intent(Intent.ACTION_VIEW); 
         intent.setDataAndType(
           Uri.fromFile(file), 
           "application/pdf"); 
    
         context.startActivity(intent); 
    
        } 
    } 
    
  • 答えて

    1

    {)

    公共ボイドは(実行しています常にヌル

    は解決この

    @Override 
        protected File doInBackground(Void... params) { 
    
         Context context = contextWeakReference.get(); 
    
         AssetManager assetManager = context.getAssets(); 
    
         File file = new File(fileRoot, fileName); 
    
         InputStream in = null; 
         OutputStream out = null; 
         try { 
    
          file.mkdirs(); 
    
          if (file.exists()) { 
           file.delete(); 
          } 
    
          file.createNewFile(); 
    
    
          in = assetManager.open(fileName); 
          Log.d(TAG, "In"); 
    
          out = new FileOutputStream(file); 
          Log.d(TAG, "Out"); 
    
          Log.d(TAG, "Copy file"); 
          copyFile(in, out); 
    
          Log.d(TAG, "Close"); 
          in.close(); 
    
          out.flush(); 
          out.close(); 
    
         } catch (Exception e) 
         { 
          Log.e(TAG, e.getMessage()); 
         } 
          return file; 
    
        } 
    
    +0

    ありがとうございました!アプリケーションが実行され、[開く]ダイアログも表示されます。 Adobe ReaderのFlash画面が表示されますが、「このファイルにアクセスできませんでした。場所またはネットワークを確認してから、もう一度試してください」というトーストメッセージが表示されます。これで私を助けてくれますか? –

    +0

    別のポイント:私は他のアプリを使いましたが、どちらも開くことができません。あたかもそのファイルがそのディレクトリにないかのようです。 –

    +0

    また!私は再びログをチェックしました:onPreExecuteは遭遇しましたが、他の2つの方法はありません!たぶんこれは、ファイルが存在しない理由です。 –

    0

    問題を編集しよう!どうやらMarshmallowは、(アンドロイドスタジオを使用してインストールしている間に)権限を求めないようなシーンの背後にある秘密をしています。私はここの答えはandroid mkdirs not workingが私のために働いたことが分かった。あなたは、設定>アプリケーション>あなたのアプリ>ストレージのアクセス許可を有効にする必要があります。これを解決するのに3日かかった!

    関連する問題