2012-05-10 2 views
34

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

Я думаю, что проблема заключается в 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 

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

«Не поддерживаемый тип документа»

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

ответ

96

Попробуйте этот код, дисплей 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); 
+2

Спасибо за окончание моего поиска. Почему это работает, а не анализирует URL-адрес из строки? –

+1

Как я могу перейти на конкретную страницу? там в любом случае? –

+0

@PratikButani. Поскольку вы используете стороннее приложение pdf для открытия pdf-файла, вы не можете обрабатывать навигацию по страницам в pdf для любой конкретной страницы. – user370305

0

Это может иметь что-то делать с тем, что файлы в папке активов получить сжатый.

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

Подробнее: https://stackoverflow.com/a/4432804/413127

+0

Я даже не пытаюсь просмотреть pdf для своего приложения. Я использовал свою ОС для копирования pdf-файла на SD-карту, и я все еще не могу просмотреть его с помощью намерения –

3

Скачать исходный код здесь (Open pdf file from sdcard in android programmatically)

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

compile ‘com.github.barteksc:android-pdf-viewer:2.0.3’ 

activity_main.xml:

<?xml version=”1.0″ encoding=”utf-8″?> 
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221; 
xmlns:tools=”http://schemas.android.com/tools&#8221; 
android:id=”@+id/activity_main” 
android:layout_width=”match_parent” 
android:layout_height=”match_parent” 
android:background=”#efefef”> 

<ListView 
android:layout_width=”match_parent” 
android:id=”@+id/lv_pdf” 
android:divider=”#efefef” 
android:layout_marginLeft=”10dp” 
android:layout_marginRight=”10dp” 
android:layout_marginTop=”10dp” 
android:layout_marginBottom=”10dp” 
android:dividerHeight=”5dp” 
android:layout_height=”wrap_content”> 

</ListView> 
</RelativeLayout> 

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<File> fileList = new ArrayList<File>(); 
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<File> 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:

<?xml version=”1.0″ encoding=”utf-8″?> 
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221; 
android:layout_width=”match_parent” 
android:background=”#ffffff” 
android:layout_height=”match_parent” 
android:orientation=”vertical”> 

<com.github.barteksc.pdfviewer.PDFView 
android:id=”@+id/pdfView” 
android:layout_margin=”10dp” 
android:layout_width=”match_parent” 
android:layout_height=”match_parent” /> 
</LinearLayout> 

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<PdfDocument.Bookmark> 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 + “-“); 
} 
} 
} 
} 

Спасибо!

0

Для 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); 
    } 
Смежные вопросы