#### 网上有很多使用pdfium项目做pdf功能,结果加入到自己项目中导致自己的apk大了20M左右,下面按照QQ加载3M左右插件的思路做了一个pdf插件
### 简单流程
打开pdf→检查是否安装插件
→未安装→下载安装插件→使用插件打开pdf
→安装过→使用插件打开pdf
![github](https://github.com/FangWW/Pdf_Plugin/blob/master/pdfplugin.gif?raw=true "github")
### 项目根目录有个123.pdf的测试文件 拷到手机根目录 如下路径
private String path = "/storage/emulated/0/123.pdf";
adb command
adb push /Volumes/Data/DownloadData/123.pdf /sdcard
### 360插件
[https://github.com/DroidPluginTeam/DroidPlugin](https://github.com/DroidPluginTeam/DroidPlugin)
### pdf项目
[https://github.com/barteksc/AndroidPdfViewer](https://github.com/barteksc/AndroidPdfViewer)
(直接项目打包apk)打成apk插件之前把PDFViewActivity修改获取intent得到文件路径,如下,
if (getIntent() != null) {
String key = getIntent().getStringExtra("key");
if (TextUtils.isEmpty(key)) {
Toast.makeText(this, "key没有", 1000).show();
} else {
Toast.makeText(this, key, 1000).show();
displayFromUri(new File(key));
}
}
调用插件
PackageManager pm = mContext.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(item.packageInfo.packageName);
intent.putExtra("key", mPath);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
((Activity) mContext).startActivity(intent);
注意
直接打包AndroidPdfViewer项目apk将会有20M左右!
原因:AndroidPdfViewer中compile 'com.github.barteksc:pdfium-android:1.6.0'的项目中的so库非常大!
libmodpdfium.so(4M多)
jnipdfium(100k多)
然后他又添加了全平台的so库x86_64,x86,mips,arm64-v8a,armeabi,armeabi-v7a
导致项目20M左右!
![github](https://github.com/FangWW/Pdf_Plugin/blob/master/QQ20170408-112947.png?raw=true "github")
解决办法:
打包AndroidPdfViewer项目的时候
配置
defaultConfig {
ndk {
abiFilters "armeabi"//, "armeabi-v7a", "arm64-v8a",x86_64,x86,mips
}
}
分别过滤只要x86,arm,mips等平台的6个apk插件包
将6个插件包放到服务端
这时下载插件的是时候只需要下载对应Android手机对应CPU的apk插件就好,就能达到QQ加载pdf插件3M左右大小的水平
为了方便测试兼容大部分手机,目前打的插件包是 "armeabi", "armeabi-v7a", "arm64-v8a"三个平台的插件,此时插件大小10M左右
PDFViewActivity完整如下
@EActivity(R.layout.activity_main)
@OptionsMenu(R.menu.options)
public class PDFViewActivity extends AppCompatActivity implements OnPageChangeListener, OnLoadCompleteListener {
private static final String TAG = PDFViewActivity.class.getSimpleName();
private final static int REQUEST_CODE = 42;
public static final int PERMISSION_CODE = 42042;
public static final int PERMISSION_CODE_1 = 42043;
public static final String SAMPLE_FILE = "sample.pdf";
public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
@ViewById
PDFView pdfView;
@NonConfigurationInstance
Uri uri;
@NonConfigurationInstance
Integer pageNumber = 0;
String pdfFileName;
@OptionsItem(R.id.pickFile)
void pickFile() {
int permissionCheck = ContextCompat.checkSelfPermission(this,
READ_EXTERNAL_STORAGE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
new String[]{READ_EXTERNAL_STORAGE},
PERMISSION_CODE
);
return;
}
launchPicker();
}
void launchPicker() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/pdf");
try {
startActivityForResult(intent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
//alert user that file manager not working
Toast.makeText(this, R.string.toast_pick_file_error, Toast.LENGTH_SHORT).show();
}
}
@AfterViews
void afterViews() {
int permissionCheck = ContextCompat.checkSelfPermission(this,
READ_EXTERNAL_STORAGE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
new String[]{READ_EXTERNAL_STORAGE},
PERMISSION_CODE_1
);
Toast.makeText(this, "允许后才能查看您的文档哟", 1000).show();
return;
}
if (getIntent() != null) {
String key = getIntent().getStringExtra("key");
// key = "/storage/emulated/0/aaaa.pdf";
if (TextUtils.isEmpty(key)) {
Toast.makeText(this, "key没有", 1000).show();
} else {
Toast.makeText(this, key, 1000).show();
displayFromUri(new File(key));
}
}
// if (uri != null) {
// displayFromUri(uri);
// } else {
// displayFromAsset(SAMPLE_FILE);
// }
setTitle(pdfFileName);
}
private void displayFromAsset(String assetFileName) {
pdfFileName = assetFileName;
pdfView.fromAsset(SAMPLE_FILE)
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.load();
}
private void displayFromUri(Uri uri) {
pdfFileName = getFileName(uri);
pdfView.fromUri(uri)
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.load();
}
private void displayFromUri(File file) {
pdfFileName = file.getName();
pdfView.fromFile(file)
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.load();
}
@OnActivityResult(REQUEST_CODE)
public void onResult(int resultCode, Intent intent) {
if (resultCode == RESULT_OK) {
uri = intent.getData();
displayFromUri(uri);
}
}
@Override
public void onPageChanged(int page, int pageCount) {
pageNumber = page;
setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
}
public String getFileName(Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
if (result == null) {
result = uri.getLastPathSegment();
}
return result;
}
@Override
public void loadComplete(int nbPages) {
PdfDocument.Meta meta = pdfView.getDocumentMeta();
Log.e(TAG, "title = " + meta.getTitle());
Log.e(TAG, "author = " + meta.getAuthor());
Log.e(TAG, "su
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Android 插件式打开PDF文件 (209个子文件)
IPluginManager.aidl 5KB
IPackageDataObserver.aidl 1KB
IApplicationCallback.aidl 1KB
IServiceConnection.aidl 860B
pdf_plug.apk 10.84MB
gradlew.bat 2KB
pdfplugin.gif 2.67MB
.gitignore 118B
.gitignore 7B
build.gradle 1KB
build.gradle 980B
build.gradle 498B
settings.gradle 31B
gradlew 5KB
gradle-wrapper.jar 52KB
layoutlib.jar 805B
IActivityManagerHookHandle.java 103KB
IPackageManagerHookHandle.java 74KB
ITelephonyHookHandle.java 53KB
IPluginManagerImpl.java 52KB
PluginManager.java 37KB
INotificationManagerHookHandle.java 28KB
IntentMatcher.java 25KB
RunningProcesList.java 24KB
MyActivityManagerService.java 23KB
ActivityStub.java 21KB
PluginPackageParser.java 21KB
PluginCallback.java 21KB
PluginProcessManager.java 21KB
ServcesManager.java 14KB
MethodUtils.java 13KB
AbstractContentProviderStub.java 13KB
PluginInstrumentation.java 13KB
PackageParserApi21.java 13KB
IPhoneSubInfoHookHandle.java 11KB
ISubBinderHookHandle.java 11KB
StaticProcessList.java 11KB
PdfPlugin.java 10KB
FieldUtils.java 10KB
MemberUtils.java 9KB
ISmsHookHandle.java 8KB
ITelephonyRegistryHookHandle.java 8KB
IWifiManagerHookHandle.java 8KB
Log.java 8KB
MyCrashHandler.java 8KB
HookFactory.java 8KB
ServiceManagerCacheBinderHook.java 7KB
IContentProviderInvokeHandle.java 7KB
LibCoreHookHandle.java 7KB
RunningActivities.java 7KB
PluginHelper.java 7KB
DownLoadManager.java 6KB
NativeLibraryHelperCompat.java 6KB
IMountServiceHookHandle.java 6KB
PackageParser.java 6KB
BaseActivityManagerService.java 6KB
PackageParserApi16.java 6KB
PluginDirHelper.java 5KB
Utils.java 5KB
IActivityManagerHook.java 5KB
AbstractServiceStub.java 5KB
IAppOpsServiceHookHandle.java 5KB
WebViewFactoryProviderHookHandle.java 5KB
BinderHook.java 5KB
IAudioServiceHookHandle.java 5KB
IMmsHookHandle.java 5KB
IClipboardHookHandle.java 5KB
PackageParserApi15.java 5KB
ShortcutProxyActivity.java 4KB
ServiceManagerBinderHook.java 4KB
IWindowSessionInvokeHandle.java 4KB
AttributeCache.java 4KB
SQLiteDatabaseHook.java 4KB
ProxyHook.java 4KB
ILocationManagerHookHandle.java 4KB
IContentServiceHandle.java 4KB
LibCoreHook.java 4KB
ServiceStubMap.java 4KB
IWindowManagerBinderHook.java 3KB
IPackageManagerHook.java 3KB
PluginCallbackHook.java 3KB
InstrumentationHook.java 3KB
MyProxy.java 3KB
ActivityThreadCompat.java 3KB
PackageParserApi22.java 3KB
IWindowManagerHookHandle.java 3KB
Utils.java 3KB
ApkItem.java 3KB
PluginClassLoader.java 3KB
IWifiManagerBinderHook.java 3KB
BuildCompat.java 3KB
HookedMethodHandler.java 3KB
IInputMethodManagerHookHandle.java 3KB
IMediaRouterServiceHookHandle.java 3KB
BaseHookHandle.java 3KB
PluginPatchManager.java 3KB
PluginManagerService.java 3KB
PackageParserApi22Preview1.java 2KB
ISearchManagerHookHandle.java 2KB
IInputMethodManagerBinderHook.java 2KB
共 209 条
- 1
- 2
- 3
资源评论
笨蛋豆豆
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功