今天在項(xiàng)目中碰見這么一個(gè)需求:獲取 Chrome 瀏覽器分享時(shí),頁面的截屏。靜下來一想,既然是分享,那么肯定得通過 Intent 來傳遞數(shù)據(jù),如果真的能獲取到 Chrome 分享頁面時(shí)的截屏,那么 Intent 的數(shù)據(jù)中,一定有 .jpg 或者 .png 結(jié)尾的數(shù)據(jù)。說干就干,Demo 寫起來。
首先,新建一個(gè) BrowserScreenShotActivity.java,在 AndroidManifest.xml 注冊(cè)一下 <intent-filter>。
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android/223392.html">android="http://schemas.android.com/apk/res/android" package="com.littlejie.demo"> <!-- 讀寫權(quán)限 --> <!-- 用于讀取瀏覽器分享時(shí)生成的屏幕截圖 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:name=".modules.DemoApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- some other thing --> <!-- 注冊(cè) Intent,用于接受瀏覽器分享 --> <activity android:name=".modules.advance.BrowserScreenShotActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.SEND"/> <!-- 發(fā)送多個(gè)數(shù)據(jù) --> <action android:name="android.intent.action.SEND_MULTIPLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="*/*"/> </intent-filter> </activity> </application></manifest>
接下去,在瀏覽器中隨便打開一個(gè)頁面,分享至 Demo,這里有個(gè)問題,就是:屏幕截圖數(shù)據(jù)在 Intent 中對(duì)應(yīng)的 Key 我們并不知道,那怎么辦呢?打斷點(diǎn)啊!

通過斷點(diǎn)查看 Intent 的數(shù)據(jù)結(jié)構(gòu),發(fā)現(xiàn) Intent 中的 mMap 成員變量含有一個(gè) Uri,格式如下:content://com.android.chrome.FileProvider/BlockedFile_33215122012582,一眼看去就猜測(cè)這個(gè) Uri 是 Chrome 通過 ContentProvider 供其他程序調(diào)用的,雖然與一開始猜測(cè)有已 .jpg 和 .png 結(jié)尾的數(shù)據(jù)不太一致,但好歹是有所發(fā)現(xiàn)。
恩,現(xiàn)在還有一個(gè)問題,那就是 mMap.value[3] 對(duì)應(yīng)的 key 值是多少?在上述斷點(diǎn)界面根本就差看不到,但是 Android Studio 是很強(qiáng)大的,只是你沒發(fā)現(xiàn)而已,既然 mMap 是一個(gè) Map,那么久能通過 keySet() 方法獲取 Map 的 key。接下來就是 Android Studio 大展拳腳的時(shí)間。

如上圖所示的,在 Debug 界面,點(diǎn)擊最后一個(gè)圖標(biāo):Evaluate Expression(快捷鍵:option + f8)。在彈出的對(duì)話框中輸入如下內(nèi)容,回車,你會(huì)發(fā)現(xiàn) Map 的 key 都出來了:

通過與第一幅圖對(duì)比,發(fā)現(xiàn)下標(biāo)為3的值(share_screenshot_as_stream)為我們需要的 key。
布局比較簡(jiǎn)單,這里就不貼了,簡(jiǎn)單截取 BrowserSrceenShotActivity.java 中的代碼:
@Overrideprotected void onResume() { super.onResume(); if (getIntent() == null) { return; } Uri screenShot = getIntent().getExtras().getParcelable("screen_shot_as_stream"); if (screenShot == null) { ToastUtil.showDefaultToast("獲取瀏覽器截屏失敗~"); return; } try { //授權(quán)Uri的讀取權(quán)限 //若不授權(quán),在 Android 6.0 以上測(cè)試崩潰 //https://thinkandroid.wordpress.com/2012/08/07/granting-content-provider-uri-permissions/ //第一個(gè)參數(shù)為需要授權(quán)的apk包名 grantUriPermission("com.littlejie.demo", screenShot, Intent.FLAG_GRANT_READ_URI_PERMISSION); //通過 Uri 獲取截屏圖片的輸入流 InputStream is = getContentResolver().openInputStream(screenShot); mIvScreenShot.setImageBitmap(BitmapFactory.decodeStream(is)); } catch (FileNotFoundException e) { e.printStackTrace(); }}運(yùn)行結(jié)果如下:

對(duì)于獲取 Chrome 瀏覽器分享頁面的截屏就告一段落,閑著沒事,自己又測(cè)試了幾個(gè)瀏覽器,包括系統(tǒng)內(nèi)置瀏覽器、QQ瀏覽器、UC瀏覽器、百度瀏覽器、火狐瀏覽器,發(fā)現(xiàn)每個(gè)瀏覽器的差異很大。
恩,就這么多,獲取瀏覽器分享頁面截屏主要還是靠瀏覽器的支持,真的市面上這么多瀏覽器適配起來還真麻煩。這次主要對(duì) Android Studio 強(qiáng)大的 Debug功能進(jìn)行了學(xué)習(xí)。PS:Android Studio真是極其強(qiáng)大的工具,用好它事半功倍,唯一不足的就是太耗性能。
Demo 代碼傳送門:DemoApplication.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注