[英]Opening PDF from android App
我正在使用自定义类从我的Android应用程序打开PDF。 它检查是否已经下载了PDF,然后使用现有的PDF Viewer应用程序打开PDF。 如果没有pdf查看器应用程序,则尝试使用google docs打开pdf。
在将Android Studio 2.2.3从2.2.3升级到Build Tool Version从24升级到25之前,该类运行良好。目标SDK仍是API24。无法找出问题的确切根源。
PDF类别 :
public class PDFTools {
private static final String GOOGLE_DRIVE_PDF_READER_PREFIX = "http://docs.google.com/viewer?url=";
private static final String PDF_MIME_TYPE = "application/pdf";
private static final String HTML_MIME_TYPE = "text/html";
/**
* If a PDF reader is installed, download the PDF file and open it in a reader.
* Otherwise ask the user if he/she wants to view it in the Google Drive online PDF reader.<br />
* <br />
* <b>BEWARE:</b> This method
* @param context
* @param pdfUrl
* @return
*/
public static void showPDFUrl( final Context context, final String pdfUrl ) {
if ( isPDFSupported( context ) ) {
downloadAndOpenPDF(context, pdfUrl);
} else {
askToOpenPDFThroughGoogleDrive( context, pdfUrl );
}
}
/**
* Downloads a PDF with the Android DownloadManager and opens it with an installed PDF reader app.
* @param context
* @param pdfUrl
*/
public static void downloadAndOpenPDF(final Context context, final String pdfUrl) {
// Get filename
final String filename = pdfUrl.substring( pdfUrl.lastIndexOf( "/" ) + 1 );
// The place where the downloaded PDF file will be put
final File tempFile = new File( context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), filename );
if ( tempFile.exists() ) {
// If we have downloaded the file before, just go ahead and show it.
Uri uri = null;
File docPath = new File(context.getExternalFilesDir(null), "Download");
File newFile = new File(docPath, filename);
uri = FileProvider.getUriForFile( context, BuildConfig.APPLICATION_ID + ".provider", newFile );
openPDF( context, uri);
return;
}
// Show progress dialog while downloading
final ProgressDialog progress = ProgressDialog.show( context, context.getString( R.string.pdf_show_local_progress_title ),
context.getString( R.string.message_please_wait ), true );
// Create the download request
DownloadManager.Request r = new DownloadManager.Request( Uri.parse( pdfUrl ) );
r.setDestinationInExternalFilesDir( context, Environment.DIRECTORY_DOWNLOADS, filename );
final DownloadManager dm = (DownloadManager) context.getSystemService( Context.DOWNLOAD_SERVICE );
BroadcastReceiver onComplete = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if ( !progress.isShowing() ) {
return;
}
context.unregisterReceiver( this );
progress.dismiss();
long downloadId = intent.getLongExtra( DownloadManager.EXTRA_DOWNLOAD_ID, -1 );
Cursor c = dm.query( new DownloadManager.Query().setFilterById( downloadId ) );
if ( c.moveToFirst() ) {
int status = c.getInt( c.getColumnIndex( DownloadManager.COLUMN_STATUS ) );
if ( status == DownloadManager.STATUS_SUCCESSFUL ) {
Uri uri = null;
try {
uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", tempFile );
}catch (IllegalArgumentException iae) {
iae.printStackTrace();
}
if (uri !=null) {
openPDF(context, uri);
}
}
}
c.close();
}
};
context.registerReceiver( onComplete, new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE ) );
// Enqueue the request
dm.enqueue( r );
}
/**
* Show a dialog asking the user if he wants to open the PDF through Google Drive
* @param context
* @param pdfUrl
*/
public static void askToOpenPDFThroughGoogleDrive( final Context context, final String pdfUrl ) {
new AlertDialog.Builder( context )
.setTitle( R.string.pdf_show_online_dialog_title )
.setMessage( R.string.pdf_show_online_dialog_question )
.setNegativeButton( R.string.pdf_show_online_dialog_button_no, null )
.setPositiveButton( R.string.pdf_show_online_dialog_button_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
openPDFThroughGoogleDrive(context, pdfUrl);
}
})
.show();
}
/**
* Launches a browser to view the PDF through Google Drive
* @param context
* @param pdfUrl
*/
public static void openPDFThroughGoogleDrive(final Context context, final String pdfUrl) {
Intent i = new Intent( Intent.ACTION_VIEW );
i.setDataAndType(Uri.parse(GOOGLE_DRIVE_PDF_READER_PREFIX + pdfUrl ), HTML_MIME_TYPE );
context.startActivity( i );
}
/**
* Open a local PDF file with an installed reader
* @param context
* @param localUri
*/
public static final void openPDF(Context context, Uri localUri ) {
Intent i = new Intent( Intent.ACTION_VIEW );
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setDataAndType( localUri, PDF_MIME_TYPE );
context.startActivity( i );
}
/**
* Checks if any apps are installed that supports reading of PDF files.
* @param context
* @return
*/
public static boolean isPDFSupported( Context context ) {
Intent i = new Intent( Intent.ACTION_VIEW );
final File tempFile = new File( context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "test.pdf" );
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
try {
i.setDataAndType( FileProvider.getUriForFile( context, BuildConfig.APPLICATION_ID + ".provider" ,tempFile ), PDF_MIME_TYPE );
}catch (IllegalArgumentException iae ) {
}
return context.getPackageManager().queryIntentActivities( i, PackageManager.MATCH_DEFAULT_ONLY ).size() > 0;
}
}
它抛出一个错误
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/<PACKAGE>/files/Download/javascript_pdf_version.pdf
我已经从堆栈溢出本身中获取了此样本。 感谢您的帮助。
试试这样的东西下载:
使用RestTemplate的WebService:
public PdfByteArrayObject getPrintjob(String empId) {
PdfByteArrayObject pdfByteArrayObject = null;
try {
getUrl();
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
pdfByteArrayObject = restTemplate.getForObject("pdfURL" + empId, PdfByteArrayObject.class);
} catch (Exception e) {
e.printStackTrace();
Log.e("webser======", e.toString());
}
return pdfByteArrayObject;
}
getUrl
方法(用于文件转换和存储):
public void getUrl() {
StringBuffer stringBuffer = new StringBuffer();
String aDataRow = "";
String aBuffer = "";
try {
File serverPath = new File(Environment.getExternalStorageDirectory(), "ServerUrl");
if (serverPath.exists()) {
FileInputStream fIn = new FileInputStream(serverPath);
BufferedReader myReader = new BufferedReader(
new InputStreamReader(fIn));
while ((aDataRow = myReader.readLine()) != null) {
aBuffer += aDataRow;
}
RestUrl = aBuffer;
Log.e("RestUrl", RestUrl + "--");
myReader.close();
} else {
Log.e("RestUrl", "File not found");
}
} catch (IOException e) {
e.printStackTrace();
}
// Toast.makeText(getApplicationContext(),aBuffer,Toast.LENGTH_LONG).show();
}
和对象:
public class PdfByteArrayObject {
private byte[] pdffile;
public byte[] getPdffile() {
return pdffile;
}
public void setPdffile(byte[] pdffile) {
this.pdffile = pdffile;
}
}
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.