Как открыть PDF через Intent с SD-карты

Я пытаюсь запустить Intent чтобы открыть PDF-файл внутри моей папки с ресурсами в моем приложении. Я читал десятки сообщений, но я все еще застрял. По-видимому, мне нужно сначала скопировать pdf-файл в SD-карту, а затем запустить Intent . Это все еще не работает.

Я думаю, что проблема заключается в запуске Intent поэтому я просто пытаюсь открыть файл «example.pdf», который я скопировал на SD-карту, используя этот код:

 Log.w("IR", "TRYING TO RENDER: " + Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf"), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { startActivity(intent); Log.e("IR", "No exception"); } catch (ActivityNotFoundException e) { Log.e("IR", "error: " + e.getMessage()); Toast.makeText(InvestorRelations.this, "No Application Available to View PDF", Toast.LENGTH_SHORT).show(); } 

Это мой вывод LogCat.

 05-10 10:35:10.950: W/IR(4508): TRYING TO RENDER: /mnt/sdcard/example.pdf 05-10 10:35:10.960: E/IR(4508): No exception 

За исключением случаев, когда этот код запущен, я получаю следующий тост (не созданный моим приложением)

Msgstr “Не поддерживается тип документа”

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

Попробуйте этот код, отобразите pdf-файл с / sdcard

 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); 

Загрузите исходный код отсюда (программно откройте pdf-файл с SD-карты в android )

Добавьте эту зависимость:

 compile 'com.github.barteksc:android-pdf-viewer:2.0.3' 

activity_main.xml:

      

MainActivity.java:

 package com.pdffilefromsdcard; import android.Manifest; import android.app.ProgressDialog; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class MainActivity extends AppCompatActivity { ListView lv_pdf; public static ArrayList fileList = new ArrayList(); PDFAdapter obj_adapter; public static int REQUEST_PERMISSIONS = 1; boolean boolean_permission; File dir; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { lv_pdf = (ListView) findViewById(R.id.lv_pdf); dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()); fn_permission(); lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { Intent intent = new Intent(getApplicationContext(), PdfActivity.class); intent.putExtra(“position”, i); startActivity(intent); Log.e(“Position”, i + “”); } }); } public ArrayList getfile(File dir) { File listFile[] = dir.listFiles(); if (listFile != null && listFile.length > 0) { for (int i = 0; i < listFile.length; i++) { if (listFile[i].isDirectory()) { getfile(listFile[i]); } else { boolean booleanpdf = false; if (listFile[i].getName().endsWith(“.pdf”)) { for (int j = 0; j < fileList.size(); j++) { if (fileList.get(j).getName().equals(listFile[i].getName())) { booleanpdf = true; } else { } } if (booleanpdf) { booleanpdf = false; } else { fileList.add(listFile[i]); } } } } } return fileList; } private void fn_permission() { if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) { } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); } } else { boolean_permission = true; getfile(dir); obj_adapter = new PDFAdapter(getApplicationContext(), fileList); lv_pdf.setAdapter(obj_adapter); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSIONS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { boolean_permission = true; getfile(dir); obj_adapter = new PDFAdapter(getApplicationContext(), fileList); lv_pdf.setAdapter(obj_adapter); } else { Toast.makeText(getApplicationContext(), “Please allow the permission”, Toast.LENGTH_LONG).show(); } } } } 

activity_pdf.xml:

     

PdfActivity.java:

пакет com.pdffilefromsdcard;

 import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.github.barteksc.pdfviewer.PDFView; import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener; import com.github.barteksc.pdfviewer.listener.OnPageChangeListener; import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle; import com.shockwave.pdfium.PdfDocument; import java.io.File; import java.util.List; public class PdfActivity extends AppCompatActivity implements OnPageChangeListener,OnLoadCompleteListener { PDFView pdfView; Integer pageNumber = 0; String pdfFileName; String TAG=”PdfActivity”; int position=-1; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pdf); init(); } private void init(){ pdfView= (PDFView)findViewById(R.id.pdfView); position = getIntent().getIntExtra(“position”,-1); displayFromSdcard(); } private void displayFromSdcard() { pdfFileName = MainActivity.fileList.get(position).getName(); pdfView.fromFile(MainActivity.fileList.get(position)) .defaultPage(pageNumber) .enableSwipe(true) .swipeHorizontal(false) .onPageChange(this) .enableAnnotationRendering(true) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .load(); } @Override public void onPageChanged(int page, int pageCount) { pageNumber = page; setTitle(String.format(“%s %s / %s”, pdfFileName, page + 1, pageCount)); } @Override public void loadComplete(int nbPages) { PdfDocument.Meta meta = pdfView.getDocumentMeta(); printBookmarksTree(pdfView.getTableOfContents(), “-“); } public void printBookmarksTree(List tree, String sep) { for (PdfDocument.Bookmark b : tree) { Log.e(TAG, String.format(“%s %s, p %d”, sep, b.getTitle(), b.getPageIdx())); if (b.hasChildren()) { printBookmarksTree(b.getChildren(), sep + “-“); } } } } 

Благодаря!

Для Android Nougat и выше версии Android требуется еще одна работа, иначе приложение не сможет открыть файл .pdf . Мы должны установить временное разрешение на URI с помощью FileProvider

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { File file=new File(mFilePath); Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file); intent = new Intent(Intent.ACTION_VIEW); intent.setData(uri); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent); } else { intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(mFilePath), "application/pdf"); intent = Intent.createChooser(intent, "Open File"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } 

Принятый ответ устарел сейчас. Используйте FileProvider для совместного использования файлов .

Это может иметь какое-то отношение к тому, что файлы в папке с ресурсами сжимаются.

Попробуйте переместить его в папку res/raw/ .

Дополнительная информация: https://stackoverflow.com/a/4432804/413127

  • Добавление сервисов Google Play в проект Eclipse
  • Background ListView становится черным при прокрутке
  • Ошибка выполнения команды 'ant' в Mac OS X 10.9 Mavericks при создании Android с помощью PhoneGap / Cordova
  • Прямоугольник рисования canvasа Android
  • Как разрешить пользователям проверять последнюю версию приложения внутри приложения?
  • Как сжимать код - предел метода 65k в dex
  • Запуск пользовательского приложения для Android от браузера android
  • Быстрые способы импорта чертежей в Android Studio?
  • android - получить текст из webview
  • Android Share Via Dialog
  • Запрос API Google Places отклонен для автозаполнения Android, даже с помощью правильного ключа api
  • Interesting Posts

    Как установить Google Chrome полностью в автономном режиме и не проверять новую версию?

    java.lang.RuntimeException: невозможно создать экземпляр активности ComponentInfo

    Разрешения по умолчанию для FTP-загрузок в ubuntu (vsftpd)

    Почему WCF возвращает myObject вместо List , как я ожидал?

    Упорядочить значки рабочего стола в Windows по категориям или разделам

    Как назначить зарегистрированного пользователя в качестве значения по умолчанию для поля модели?

    Это . in. Изменить, если это определено .Cells?

    Как сериализовать объект Exception в C #?

    Как перебирать ключи и значения с помощью ng-repeat в AngularJS?

    Как создать привязанную строку с помощью Swift?

    Windows 8.1 продолжает делать устройство отключенным и подключенным звуком

    Boost C ++ regex – как получить несколько совпадений

    Как изменить имя пакета приложения для Android

    Получить текущее время в миллисекундах с использованием C ++ и Boost

    MKLINK vs. Junction.exe

    Давайте будем гением компьютера.