Подтвердить что ты не робот

Как открыть 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);

Любые идеи или предложения?

Заранее спасибо

4b9b3361

Ответ 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) {

                }
            }
        }


    });
}
}