Как открыть PDF файл, хранящийся в папке res/raw или assets?
В моем приложении я покажу pdf файл, и файл PDF должен быть связан с приложением.
Каков хороший способ сделать это?
Я прочитал, что это возможно сделать, добавив файл pdf в папку res/raw и прочитав его оттуда, но я получаю ошибки проекта, когда я помещаю там файл pdf.
Итак, я попытался поместить файл pdf в папку с активами проекта и не дал никаких ошибок.
Вот как я пытался показать pdf:
File pdfFile = new File("res/raw/file.pdf");
Uri path = Uri.fromFile(pdfFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Любые идеи или предложения?
Заранее спасибо
Ответы
Ответ 1
Вы могли бы показать его с raw/
или assets/
, если ваше приложение действительно реализовало программу чтения PDF. Поскольку вы хотите, чтобы он отображался в отдельном приложении (например, Adobe Reader), я предлагаю сделать следующее:
- Сохраните файл PDF в каталоге
assets/
.
- Когда пользователь хочет просмотреть его, скопируйте его где-нибудь public. Посмотрите
openFileOutput
или getExternalFilesDir
.
- Запустите
Intent
так же, как сейчас, за исключением использования getAbsolutePath()
в новом файле для данных намерения.
Помните, что у пользователя может не быть приложения для чтения PDF. В этом случае полезно поймать ActivityNotFoundException
и показать соответствующее сообщение.
Ответ 2
Вы не можете открыть pdf файл напрямую из папки assets. Сначала вам нужно записать файл на SD-карту из папки с ресурсами, а затем прочитать его с SD-карты. Код выглядит следующим образом: -
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File fileBrochure = new File(Environment.getExternalStorageDirectory() + "/" + "abc.pdf");
if (!fileBrochure.exists())
{
CopyAssetsbrochure();
}
/** PDF reader code */
File file = new File(Environment.getExternalStorageDirectory() + "/" + "abc.pdf");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),"application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try
{
getApplicationContext().startActivity(intent);
}
catch (ActivityNotFoundException e)
{
Toast.makeText(SecondActivity.this, "NO Pdf Viewer", Toast.LENGTH_SHORT).show();
}
}
//method to write the PDFs file to sd card
private void CopyAssetsbrochure() {
AssetManager assetManager = getAssets();
String[] files = null;
try
{
files = assetManager.list("");
}
catch (IOException e)
{
Log.e("tag", e.getMessage());
}
for(int i=0; i<files.length; i++)
{
String fStr = files[i];
if(fStr.equalsIgnoreCase("abc.pdf"))
{
InputStream in = null;
OutputStream out = null;
try
{
in = assetManager.open(files[i]);
out = new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + files[i]);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
break;
}
catch(Exception e)
{
Log.e("tag", e.getMessage());
}
}
}
}
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);
}
}
Вот и все.. Наслаждайтесь!! и, пожалуйста, не забудьте дать + 1. Спасибо
Ответ 3
Я использовал следующий формат для открытия исходных ресурсов из моего собственного приложения. Я не тестировал, может ли другое приложение открывать ваш исходный ресурс.
Uri path = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.myPdfName);
Ответ 4
Ваше намерение в формате PDF кажется хорошим, но вы должны попробовать это, чтобы получить Uri файла в исходной папке:
Uri path = Uri.parse("android.resource://<you package>/raw/<you file.pdf>");
(Источник)
Ответ 5
моим приложениям необходимо открыть файл pdf файла в исходных данных на внешнем приложении...
im написать:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.OpenPdfButton);
button.setOnClickListener(new View.OnClickListener() {
InputStream is = getResources().openRawResource(R.raw.filepdf);
@Override
public void onClick(View v) {
startpdf();
}
private void startpdf() {
// TODO Auto-generated method stub
File file = new File("R.id.filepdf");
if (file.exists()) {
Uri path = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
startActivity(intent);
}
catch (ActivityNotFoundException e) {
}
}
}
});
}
}