在这两种情况下,我都没有完成这项任务:
1。尝试从手机记忆库中打开它 2。尝试从资产中打开它
我的 render()方法位于 1st 的情况下,如下所示:
private void render() {
try {
imageView = (ImageView) findViewById(R.id.page);
int REQ_WIDTH = 1;
int REQ_HEIGHT = 1;
REQ_WIDTH = imageView.getWidth();
REQ_HEIGHT = imageView.getHeight();
Bitmap bitmap = Bitmap.createBitmap(REQ_WIDTH, REQ_HEIGHT, Bitmap.Config.ARGB_4444);
File file = new File(Environment.getExternalStorageDirectory() + "/Download/test.pdf");
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
if (currentPage < 0) {
currentPage = 0;
} else if (currentPage > renderer.getPageCount()) {
currentPage = renderer.getPageCount() - 1;
}
Matrix matrix = imageView.getImageMatrix();
Rect rect = new Rect(0, 0, REQ_WIDTH, REQ_HEIGHT);
renderer.openPage(currentPage).render(bitmap, rect, matrix, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
imageView.setImageMatrix(matrix);
imageView.setImageBitmap(bitmap);
imageView.invalidate();
renderer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
抛出异常is here中最有趣的部分。如果您想查看整个日志click here。
是的,我已在AndroidManifest.xml
中添加了所需的权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.john.pdfreader">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".BookActivity">
<intent-filter>
<action android:name="com.example.schoolreader.BookActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
让我们看看 2nd 案例(从资产中读取):
// ...previous code
ParcelFileDescriptor input = getAssets().openFd("test.pdf").getParcelFileDescriptor();
PdfRenderer renderer = new PdfRenderer(input);
// ..previous code
在这种情况下,它说的是相同的,但是如果我没记错的话,有人说cannot create document
,但现在它已经消失,异常看起来一样。无论如何,为什么我开始谈论第二个案例? There's an open issue说META-INF
应该在apk的末尾。我的是最后的,它仍然无法正常工作。
坦率地说,我甚至尝试过Androidstudio本身的一个例子。你知道吗?它的工作原理!但只有他们的sample.pdf
,当我尝试用它替换它时,它只会崩溃。你知道我可以尝试在我的Android上制作pdf渲染吗?
所有内容都在Nexus 5,Android 6.0 Marshmallow上进行了测试。
答案 0 :(得分:1)
除了清单中的权限外,您可能需要明确请求许可。类似的东西:
int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED)
{
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}