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 沒有這個問題。