Android – доступ к файлу из активов \ PDF-дисплей

Я пытаюсь получить ссылку на файл, хранящийся в каталоге assets в файл с именем myfile.pdf . Я попытался сделать это следующим образом:

 File file = new File("android_assest/myfile.pdf); Log.d("myTag", "" + file.isFile()); 

Так или иначе, я myfile.pdf когда myfile.pdf действительно существует в каталоге assets . Я проверил его, используя getAssets().list("") и Log.d() каждый элемент в возвращаемом массиве.

Более того, я пытаюсь получить ссылку на файл PDF, а затем использовать любой просмотрщик PDF, который уже установлен на устройстве, для просмотра PDF.

Я предполагаю, что, поскольку предыдущая проблема (получение ссылки на файл) возвращает false следующий следующий код:

 Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("file:///android_asset/myfile.pdf")); startActivity(i); 

Кто-нибудь знает, почему я не могу получить ссылку на файл? И почему я не могу использовать уже установленный просмотрщик PDF для отображения PDF (после получения ссылки на файл PDF)?

Благодарю.

Как сказал Барак, вы можете скопировать его из активов на внутреннее хранилище или на SD-карту и открыть ее там, используя встроенные pdf-приложения.

Следующий фрагмент поможет вам. (Я обновил этот код для записи и чтения файлов из внутреннего хранилища.

Но я не рекомендую этот подход, потому что файл pdf может иметь размер более 100 МБ.

Поэтому не рекомендуется сохранять этот огромный файл во внутреннем хранилище

Также убедитесь, что при сохранении файла во внутреннем хранилище

 openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); 

Тогда только другие приложения могут его прочитать.

Проверьте следующий фрагмент.

 package org.sample; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import android.os.Bundle; import android.util.Log; public class SampleActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CopyReadAssets(); } private void CopyReadAssets() { AssetManager assetManager = getAssets(); InputStream in = null; OutputStream out = null; File file = new File(getFilesDir(), "git.pdf"); try { in = assetManager.open("git.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() + "/git.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); } } } 

Обязательно включите

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

В манифест

Вы не можете так сделать. В apk нет структуры каталогов, это просто данные. Структура знает, как получить к ней доступ ( getAssets ), но вы не можете искать ее как файл в каталоге.

Вы можете открыть его как входной поток …

 in = new BufferedReader(new InputStreamReader(activity.getAssets().open(myfile.pdf))); 

Или вы можете скопировать его из активов во внутреннее хранилище или на SD-карту и получить к ней доступ.

Как говорят Vipul Shah , но в случае для внешнего.

 import android.app.Activity; import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import android.os.Environment; import android.os.Bundle; import android.util.Log; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); copyReadAssets(); } private void copyReadAssets() { AssetManager assetManager = getAssets(); InputStream in = null; OutputStream out = null; String strDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "Pdfs"; File fileDir = new File(strDir); fileDir.mkdirs(); // crear la ruta si no existe File file = new File(fileDir, "example2.pdf"); try { in = assetManager.open("example.pdf"); //leer el archivo de assets out = new BufferedOutputStream(new FileOutputStream(file)); //crear el archivo 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://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + "Pdfs" + "/example2.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); } } } 

Измените части кода следующим образом:

 out = new BufferedOutputStream(new FileOutputStream(file)); 

Предыдущий пример для Pdfs, в случае, например, .txt

 FileOutputStream fos = new FileOutputStream(file);