androidpdfapi
㈠ 制作安卓PDF阅读器:七、实现多实例打开、文档目录树
无论什么平台,任雹闷何查看器都理应支持多实例模式。不仅仅要支持多实例模式,还要可以切换到单实例模式,而且在多实例下,在外部App重复打开同一文件,可跳转至已有实例,而不会重复打开相同的多实例,这便是设计。
为此,需大量运用 static 全局变量。不必担心内存泄漏,只要不崩溃,就可以在 onDestroy 中释放引用。若是不慎崩溃,整个虚拟进程都被关闭了带陪,又有什么可担心的呢?
从桌面打开主界面有两种选择:
主界面UI
底栏:【前进,后退,搜索,书签大纲,宫格更多】
宫格更多 第二底栏(底栏之上)
宫格:【夜间模式,历史记录,书签,设置,缩略图模式,转屏,朗读,页面跳转,进度条,小缩略图,左侧小缩略图,右侧小笔记】
底栏:【退出程序,退离程序,返回】
尼玛这些慢慢做,够我做一年……
先从底栏做起吧,然后定制底栏,然后宫格及其变形动画。
燃鹅时间有限,所以可能取消动画,取消自定义,速战速决……
优化 TellH / RecyclerTreeView :
其实 listview 也能达到类似的效果(见下方),不过既然有人(似乎是抖音安卓团队)专门抽离出了libarary,就不必再造轮子了,改进就行。寥寥二三文件就不必新建库模块了,源码拉直接拉进去,简单又省事。
目录对话框:viewpager,并排【书签,目录,注释列表】
Dialog + viewpager + FragmentPagerAdapter + 以上三个Fragment
需注意 FragmentPagerAdapter 的构造参数。应当传入 getChildFragmentManager() 而不是 getSupportFragmentManager(),否则因为这里是 Dialog 嵌套 Fragment,传全局的FragmentManager会导致APP崩溃(No view found for id … for fragment … 异常)。
既然决定使用 Dialog 了,不妨直接上 DialogFragment。后者的配置更加灵蠢肆蠢活,既可以当做 Dialog 弹出对话框,又可以选择将之当作普通的 Fragment ,直接加载进入主界面布局。
对话框界面设计分三层:
Toolbar【各种小按钮】
viewpager【书签,目录,注释列表】
TabLayout【书签,目录,注释列表】
拉取PDF目录,需要用到的API有:FPDFBookmark_GetFirstChild、FPDFBookmark_GetNextSibling、FPDFBookmark_GetTitle、FPDFBookmark_GetDest,没有编辑功能。
其实 PDF 的书签目录除了页码外,还可以包含一些视图参数,大概是缩放、页面位置这些。既然PDFium不支持编辑书签,那暂时就这样。
记录一下复用这个目录树对话窗口引发的recyclerview不响应notifydatasetchanged调用的bug。(解决fragment嵌套viewpager再嵌套recyclerview导致recyclerview无法正常更新的BUG。)
dismiss并复用后,点击列表中的目录,目录不再展开,recyclerview不更新视图。但是 滚动 一下recyclerview(即使条目很少无法真正滚动,向上划一下也会有效果。),发现视图更新了,这证明逻辑处理并无问题。那么问题出在哪呢?
答案是 viewpager 的adapter不能被复用。关键在于这个adapter传入了一个getChildFragmentManager()对象。而这玩意儿在对话框dismiss后就会立即失效。所以即使视图是复用的,第二次的onCreateView也需要重新给viewpager设置adapter。
㈡ Android——Android10的分区存储(Scoped Storage)
在Android10以前,只要程序获得了READ_EXTERNAL_STORAGE权限,就可以随意读取外部的存储公有目录。只要程序获得了WRITE_EXTERNAL_STORAGE权限,就可以随意在写入外部存储的公有目录上新建文件或文件夹
于是Google在Android10中提出了分区存储,意在限制程序对外部存储中公有目录的使用。
分区存储对内部存储私有目录和外部存储私有目录都没有影响
简单来说就是,在Android10中,
使用分区存储的应用对自己创建的文件始终拥有读/写权限, 无论文件是否位于应用的私有目录内 ,所腊好以,如果应用仅保存和访问自己创建的文件,则无需请求获得READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限
如果要访问其他应用创建的文件,则需要READ_EXTERNAL_STORAGE权限。并且仍然只能使用MediaStore提供的API或是SAF访问。
这里需要注意的是,MediaStore提供的API只能访问图片、视频、音频,如果需要访问其它任意格式的文件,需要使用SAF,它会调用系统内置的文件浏览器供用户自主选择文件
Android Q规定了App有两种存储空间模式视图:Legacy View、Filtered View
系统通过下列方式确定App的运行模式:
判断当前App运行的是什么模式,可以通过Environment提供的API进行判断
MediaStore提供了下列几种类型圆闷的访问Uri,通过查找对应Uri数据,达到访问的目的。
我们还可以使用getContentUri获取所有<volumeName>
MediaProvider对于App存放到公共目录文件,通过ContentResolver insert方法中Uri来确定
MediaStroe通过不同Uri,为用户提供了增、删、改方法,权限对应如下
例如PDF,PDF为非媒体类文件,因此我们不能通过MediaStore来获取,对于这种其他类型的文件,一般使用SAF来让用户选择
我们也推荐使用SAF让用户自己去创建,IntentAction为:ACTION_CREATE_DOCUMENT
访问app-specific分为橘局弯两种情况,一种是访问App自身App-specific目录,第二是访问其他App目录文件
Android Q,App如果启动了Filtered View,那么只能直接访问自己目录的文件:
App是FilteredView,其他App无法直接访问当前App私有目录,需要通过以下方法:
㈢ 《Android应用开发攻略》pdf下载在线阅读全文,求百度网盘云资源
《Android应用开发攻略》(Ian F. Darwin)电子书网盘下载免费在线阅读
链接: https://pan..com/s/1WyxYeJQHxQGR2IgnveMikA
书名:Android应用开发攻略
作者:Ian F. Darwin
译者:姚军
出版社:机械工业出版社华章公司
出版年份:2013-3-31
页数:648
内容简介:
在200多个经过测试的攻略帮助下,你可以投入构建Android应用的工作中。通过本书,你能找到有关用户界面、多点触摸手势、位置感知、Web服务以及电话、相机、加速计等设备功能的解决方案。你还能够得到为Android Market包装应用程序的有用步骤。
本书适合于熟悉java、Android基础知识和Java SE API的开发人员,其中的攻略由30多位Android社区的开发人员贡献。每个攻略都提供了清晰的解决方案和可以马上用于项目中的样例代码。在大量的主题中,本书能够帮助你:
运用指导原则设计成功的Android应用程序
使用UI控件、高效的布局和图形元素
学习如何在应用程序中利用Android的丰富特性
存储和读取文件、SD卡和嵌入式数据库中的应用程序数据
访问REST风格的Web服务、RSS/Atom 源以及来自网站的信息
创建位置感知服务,寻找位置和地标、并在Google Maps和OpenStreetMap上加以标注
测试单独组件和整个应用程序并排除故障
作者简介:
Ian F.Darwin是一位软件开发人员、顾问和教师,有着30余年的计算机从业经验。他是《Checking C Programs with Lint》、《Java Cookbook》(均由O'Reilly出版)的作者,还撰写了100多篇文章和教程,内容涵盖了UNIX、C、Java、Mac、Python、Android和Web等。
㈣ 《Android程序设计Android程序设计》pdf下载在线阅读,求百度网盘云资源
《Android程序设计》(Zigurd Mednieks)电子书网盘下载免费在线阅读
链接:
书名:Android程序设计
作者:Zigurd Mednieks
译者:祝洪凯
出版社:机械工业出版社华章公司
出版年份:2013-3-1
页数:456
内容简介:
如何才能构建设计良好的Android应用?通过本书提供的权威指南,深入探索Android核心模块及其API,了解如何创建可以运行在一系列Android设备上的出色的应用软件。本书将带你探索行之有效的应用设计和实施方式,包括一些应用框架,你可以把这些框架作为自己项目的起始点。
深入传感器、本地开发、3D图形和许多其他主题,并发现如何在选择的平台上构建应用程序。如果你要进阶到高级程序员,你将学会如何创建良好的Android应用程序。
作者简介:
Zigurd Mednieks是领先的OEM、企业和创建基于Android系统的创业投资顾问。
Laird Dornin是一家大型无线运营商的高级工程师,在Java、Android、J2ME、SavaJe和WebKit方面有丰富的经验。
G.Blake Meike是一位经验丰富的开发人员,为移动和服务端平台构建Java应用有丰富的经验。
Masumi Nakamura是Where Inc.的Big Data和Recommendations组的首席架构师。
㈤ Android设代理通过webView连接Gmail登录时,怎么除掉“loading,please wait...”提示空白页的显示
https://mail.google.com/accounts/SetOSID?continue=https%3A%2F%2Faccounts.youtube.com%2Faccounts%2FSetSID%3Fssdc%3D1%26sidt%vfRYAvyh89f65vjPPU%252For9IG87mXhElLxHlO%252FHmqBJjUgZqzvGRL%252BnVI7F9M7RYTHRIg%252FQ9jk6Ob5RcWy4S27JuKyOo%252FlF6ktIsuAEmhEBUc%252Fgp4NeBqoYM8xm%252BmxHMgTMSuUa%252BWHvyvyxzugrErQDnP7VvXQcL%252BZ3QYENpU8I7lzOpL%252FLxZ7zvigjZA%252FN%Fs7FmSMsXp1X1%252Ft0UNMBAWddQ8pI34QtTvCsGuA%252B2rEAPIAuFv8T%252BLgSzV9iC%252B%252F3%252B1nfUA1L8LtnTN41Cd0LjsNDzP%zk1twhlLuqOWG07YgQNgA%253D%26continue%3Dhttps%253A%252F%252Fmail.google.com%252Fmail%252F%253Fauth%-uPsQ0m77o5oFuzqwflG1BtQfndQb---_vH6uc5TFsA46WwpqTSzRS0Kb6p_lZ6tXJKk6cIZs2xAUHrB_2C4AQo3yzFbpoEapkjd_Bp2cdJfJb4nkhH_PRYkbO5gJDg6bPJAvCGa6f_VTnO5exuMQYu6%26dbus%3DHK.2&osidt=ALWU2cuyCD2Zw2---bWM5WtQWipmgotjInq25_-_uMYrNlvO1Thy_-plzEvHG8VjmgfQ_7-Ps5-44VSu
https://accounts.youtube.com/accounts/SetSID?ssdc=1&sidt=RYAvyh89f65vjPPU%2For9IG87mXhElLxHlO%2FHmqBJjUgZqzvGRL%2BnVI7F9M7RYTHRIg%2FQ9jk6Ob5RcWy4S27JuKyOo%2FlF6ktIsuAEmhEBUc%2Fgp4NeBqoYM8xm%2BmxHMgTMSuUa%2BWHvyvyxzugrErQDnP7VvXQcL%2BZ3QYENpU8I7lzOpL%2FLxZ7zvigjZA%2FN%7FmSMsXp1X1%2Ft0UNMBAWddQ8pI34QtTvCsGuA%2B2rEAPIAuFv8T%2BLgSzV9iC%2B%2F3%2B1nfUA1L8LtnTN41Cd0LjsNDzP%1twhlLuqOWG07YgQNgA%3D&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fauth%-uPsQ0m77o5oFuzqwflG1BtQfndQb---_vH6uc5TFsA46WwpqTSzRS0Kb6p_lZ6tXJKk6cIZs2xAUHrB_2C4AQo3yzFbpoEapkjd_Bp2cdJfJb4nkhH_PRYkbO5gJDg6bPJAvCGa6f_VTnO5exuMQYu6&dbus=HK.2
https://accounts.google.com.hk/accounts/SetSID?ssdc=1&sidt=Utxl24mNbrfaMLUMw%2BTpfUFndRV3hCITg7ebJ2XWQU%2BwPCjo3zMqcl9mgsGOu26YGdnS%2FRtAD8BOH0j%2BvVoVK%%%2BVD%%%%%2F6Ycp%2BkFvMmXSap5Q%3D&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fauth%-uPsQ0m77o5oFuzqwflG1BtQfndQb---_vH6uc5TFsA46WwpqTSzRS0Kb6p_lZ6tXJKk6cIZs2xAUHrB_2C4AQo3yzFbpoEapkjd_Bp2cdJfJb4nkhH_PRYkbO5gJDg6bPJAvCGa6f_VTnO5exuMQYu6
https://mail.google.com/mail/?auth=-uPsQ0m77o5oFuzqwflG1BtQfndQb---_vH6uc5TFsA46WwpqTSzRS0Kb6p_lZ6tXJKk6cIZs2xAUHrB_2C4AQo3yzFbpoEapkjd_Bp2cdJfJb4nkhH_PRYkbO5gJDg6bPJAvCGa6f_VTnO5exuMQYu6
https://mail.google.com/mail/
https://mail.google.com/mail/u/0/
https://mail.google.com/mail/u/0/x/8i9l1178ju3a-/?f=1
https://mail.google.com/mail/mu/
https://mail.google.com/mail/mu/mp/983/
https://mail.google.com/mail/mu/mp/983/
看了下,在登录的过程中一共跳转了这么多个url,也就是说登录的过程中需要和客户端进行多次交互,解决思路就是重写shouldOverrideUrlLoading(WebView view, String url) 方法,把中间这些url全部拦截下来,这样就能够不显示,同时你也可以完成一些自定义的操作。
㈥ android print 怎么用
可以使用webview调用Google Cloud Print的web接口
在KitKat系统中进行打印
有了这薯手罩个打印的API,Android上打印就变得更简单、更可靠了。这是它的API的更新列表,以包的形式组织:
Android.support.v4.print
PrintHelper – bitmap打印队列工具类。
Android.print
PrintDocumentAdapter – 提供自定义打印文档的基础类。
PrintManager – 访问打印队列,并提供PrintDocumentAdapter类支持。
Android.print.pdf
PrintedPdfDocument – 基于特定PrintAttributeshelper创建PDF。薯如
Android.webkit
WebView.createPrintDocumentAdapter – 为WebView打印数闹内容创建PrintDocumentAdapter。
Android.printservice
实现自定义PrintService的容器类。
㈦ Aspose pdf和word转换
需要使用“aspose-words”包,大小为13M,默认选纯伍项转换:
使用最新版19.3,按照API文档里说明的方式去转换,崩溃:
看到论坛上官方说要使用临时License解锁所有功能,申请并且添加认证成功:
但还是崩溃;最后按照首页广告里介绍写的方式去转换,崩溃:
不太可能吧!已经发帖求助官方。
最后论坛上又全部翻了一遍,android端的讨论很少洞穗,但是发现一位老哥遇到了同样的问题,官方的答复来看确实是有BUG:
最后的最后,尝试了旧版本,18.6,好吧,也还是崩溃;
回到之前调纳裤卜研的竞品com.hun.androidpdfchanger上,发现其PDF转word用的是在线的........
㈧ Android上生成word或者pdf,有开源的api么
Android上生成word或者pdf,有开源的api么?思路有两个:
1、通过jni调用 ms word com接口 生成pdf
2、使用openoffice生成pdf
从生成的质量来看,第一种效果好,毕竟是微软自家产品。第二种对于普通的文档,转换基本没什么问题,但是在对于word文档里有公式式或特殊内容,转换出来会变形。下面的代码是使用
Jacob转换的 代码有点长:我整理的文章:itate-动态-文章《Android上生成word或者pdf,有开源的api么?》
㈨ android 如何获得pdf文件的页数
分页方法:
打开网络pdf 思路整体还是来源与图片的加载。
android中加载网络图片的框架有很多个。如image-laoder, fresco、glide等,首先都是从内存中找图片,如果内存中没有,接着从本地找,本地没有在从网络下载。
android中加载pdf也是类似,首先从本地找pdf文件,如果本地存在该pdf文件,直接打开,如果本地不存在,将该pdf文件下载到本地在打开。
下载文件用到了retrofit2的库,已经封装到android_pdf中了。
2.依赖android_pdf库方法
2.1 在项目的gradle中增加如下代码:
compile 'com.lidong.pdf:android_pdf:1.0.1'
2.2 一句代码就可以加载网络pdf。
```
pdfView.fileFromLocalStorage(this,this,this,fileUrl,fileName); //设置pdf文件地址
```
2.3对fileFromLocalStorage(this,this,this,fileUrl,fileName)的解析
/**
```
* 加载pdf文件
* @param onPageChangeListener
* @param onLoadCompleteListener
* @param onDrawListener
* @param fileUrl
* @param fileName
*/
public void fileFromLocalStorage(
final OnPageChangeListener onPageChangeListener,
final OnLoadCompleteListener onLoadCompleteListener,
final OnDrawListener onDrawListener,
String fileUrl,
final String fileName)
```
1. OnPageChangeListener onPageChangeListener :翻页回调
2. OnLoadCompleteListener onLoadCompleteListener:加载完成的回调
3. OnDrawListener:页面绘制的回调
4. String fileUrl : 文件的网络地址
5. String fileName 文件名称
3.使用android_pdf库方法
3.1写一个布局文件
```
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lidong.pdf.androidpdf.MainActivity">
<com.lidong.pdf.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
```
3.2在MainActivity中加载
```
import android.graphics.Canvas;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.lidong.pdf.PDFView;
import com.lidong.pdf.api.ApiManager;
import com.lidong.pdf.listener.OnDrawListener;
import com.lidong.pdf.listener.OnLoadCompleteListener;
import com.lidong.pdf.listener.OnPageChangeListener;
import com.lidong.pdf.util.FileUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import okhttp3.ResponseBody;
import rx.android.schelers.AndroidSchelers;
import rx.functions.Action1;
import rx.schelers.Schelers;
public class MainActivity extends AppCompatActivity implements OnPageChangeListener
,OnLoadCompleteListener, OnDrawListener {
private PDFView pdfView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pdfView = (PDFView) findViewById( R.id.pdfView );
displayFromFile1("http://file.chmsp.com.cn/colligate/file/00100000224821.pdf", "00100000224821.pdf");
}
/**
* 获取打开网络的pdf文件
* @param fileUrl
* @param fileName
*/
private void displayFromFile1( String fileUrl ,String fileName) {
pdfView.fileFromLocalStorage(this,this,this,fileUrl,fileName); //设置pdf文件地址
}
/**
* 翻页回调
* @param page
* @param pageCount
*/
@Override
public void onPageChanged(int page, int pageCount) {
Toast.makeText( MainActivity.this , "page= " + page +
" pageCount= " + pageCount , Toast.LENGTH_SHORT).show();
}
/**
* 加载完成回调
* @param nbPages 总共的页数
*/
@Override
public void loadComplete(int nbPages) {
Toast.makeText( MainActivity.this , "加载完成" + nbPages , Toast.LENGTH_SHORT).show();
}
@Override
public void onLayerDrawn(Canvas canvas, float pageWidth, float pageHeight, int displayedPage) {
// Toast.makeText( MainActivity.this , "pageWidth= " + pageWidth + "
// pageHeight= " + pageHeight + " displayedPage=" + displayedPage , Toast.LENGTH_SHORT).show();
}
```
㈩ 制作安卓PDF阅读器:三、实现文本选择
我为什么要开启这个系列,努力试着从源头开始,用 PDFium 制作一款阅读器?有人喜欢问这个做了有什么用,这个是唯一的吗?
当然不是唯一的,底层技术更不是我的。不过我认为在维护者的推动下,PDFium 越来越完善,功能越来越多,不 真正 拿来做些什么实在是可惜了。另一个重要原因则是,其他APP要么臃肿或者简陋,要么用着磕手、滑动卡顿、误触频发,而且大多还不免费。( 更正,近年来倒是多了好多免费的PDF阅读器 )
目标期望:
热身运动:当检测到单击( GestureDetector )时,若点击处存在超链接,则打印出超链接的对象。
头文件:fpdf_doc.h
需要将屏幕坐标转换为页面坐标,然后再次在native层转换为所谓的user space、page space。别问我那是啥我也不知道。不过在论坛提问后,有人替我指出了相关文档所在,有时间去看看!
屏幕坐标:[event.getX(), event.getY()]
页面坐标:先前提过将整本PDF当作一张超级大图,subsampling-scale-imageview 有一系列的 viewToSource 坐标转换方法。屏幕转换得到 source 坐标后,减去点击页面的左上角坐标,就是页面坐标。
原始页面坐标需用 FPDF_DeviceToPage 再次转换,才能传给FPDFLink_GetLinkAtPoint,获取坐标处的链接指针。
超链接对象统一返回字符串,可以是Uri地址,也可以是页码 @页码 。
热身运动2:在单击处获取一个英文单词或者汉语词组,需要用到安卓的 BreakIterator。
头文件:fpdf_text.h
首先实现 nativeGetCharIndexAtCoord 方法,获取单击附近的文字索引,需进行同样的坐标转换。
若返回的文字index大于等于零,则此 index 指向该页面全部文本当中的一个字符。全部文本用 FPDFText_GetText 获取(实现 nativeGetText):
接下来就可以用 BreakIterator 分词了:
与绘制PDF本身差不多,不过 bitmap 换成 rect 而已。用到的API依次是FPDFText_CountRects、FPDFText_GetRect。
直接将选框覆盖绘制在前。若要绘制在后面的背景上,就需要三层透明视图了,那么加载铺块和缩略图的时候就要用透明色清空 bitmap,页面的白色背景等也需要另外绘制(Google PDF Viewer应该就是这样,还给背景加了阴影)。这些较为复杂,到时候再说。
有个问题可能需要解决:同一行的选框,部分没有合并。
都是小事儿,暂时不在这上面花时间。
之前做过类似的事情,将普通 TextView 自带的文本选择功能禁用了,然后用API自己做出一个来,包括单击选词,长按托选,放大镜等等。所以相关的内容还是熟悉的。
绘制 Selection Handle 可以用 AppCompat 支持库中的图标资源:
控点的触控操作也很简单,在 Action_Down 中检测落点是否在其中一个 handle 内。若是,则在 Action_Move 中一边移动该 handle,一边检测新的字符索引,作为文本选择的新边界。
由于PDF的复杂性,页面上的字符索引可能间杂排列,比如头一段开头是100,下一段开头50,再下一段150。这就造成先前简单的选择系统“失效”了:
没什么解决方案,API 就这么点。而且,静读天下、Google PDF 查看器都是这样的,唯有 ezpdfreader 没有这个问题。