私のアプリケーションには、クリックするとPDFが開きます( "Open with"プロンプトが表示されます)というボタンがあります。 PDFファイルはアプリの私のアセットフォルダにあります。 AsyncTaskがassetsフォルダから外部ストレージにコピーしてから開くという操作を実行するようなコードを書いています。ただし、AsyncTaskクラスのメソッドは実行されていないので、Logcatから見ることができます。私は他の同様の質問を見て、その異なった答え試してみました:AsyncTaskのメソッドはありません
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)の代わりに、.executeを()
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR、(ボイド[])はnull); onPreExecute()
を追加
私は、以下の方法を実行これを呼び出す:ファイル
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);
}
}
ありがとうございました!アプリケーションが実行され、[開く]ダイアログも表示されます。 Adobe ReaderのFlash画面が表示されますが、「このファイルにアクセスできませんでした。場所またはネットワークを確認してから、もう一度試してください」というトーストメッセージが表示されます。これで私を助けてくれますか? –
別のポイント:私は他のアプリを使いましたが、どちらも開くことができません。あたかもそのファイルがそのディレクトリにないかのようです。 –
また!私は再びログをチェックしました:onPreExecuteは遭遇しましたが、他の2つの方法はありません!たぶんこれは、ファイルが存在しない理由です。 –