Android 獲取瀏覽器當(dāng)前分享頁面的截屏示例
今天在項目中碰見這么一個需求:獲取 Chrome 瀏覽器分享時,頁面的截屏。靜下來一想,既然是分享,那么肯定得通過 Intent 來傳遞數(shù)據(jù),如果真的能獲取到 Chrome 分享頁面時的截屏,那么 Intent 的數(shù)據(jù)中,一定有 .jpg 或者 .png 結(jié)尾的數(shù)據(jù)。說干就干,Demo 寫起來。
首先,新建一個 BrowserScreenShotActivity.java,在 AndroidManifest.xml 注冊一下 <intent-filter>。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.littlejie.demo">
<!-- 讀寫權(quán)限 -->
<!-- 用于讀取瀏覽器分享時生成的屏幕截圖 -->
<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 -->
<!-- 注冊 Intent,用于接受瀏覽器分享 -->
<activity
android:name=".modules.advance.BrowserScreenShotActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<!-- 發(fā)送多個數(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>
接下去,在瀏覽器中隨便打開一個頁面,分享至 Demo,這里有個問題,就是:屏幕截圖數(shù)據(jù)在 Intent 中對應(yīng)的 Key 我們并不知道,那怎么辦呢?打斷點(diǎn)啊!
通過斷點(diǎn)查看 Intent 的數(shù)據(jù)結(jié)構(gòu),發(fā)現(xiàn) Intent 中的 mMap 成員變量含有一個 Uri,格式如下:content://com.android.chrome.FileProvider/BlockedFile_33215122012582,一眼看去就猜測這個 Uri 是 Chrome 通過 ContentProvider 供其他程序調(diào)用的,雖然與一開始猜測有已 .jpg 和 .png 結(jié)尾的數(shù)據(jù)不太一致,但好歹是有所發(fā)現(xiàn)。
恩,現(xiàn)在還有一個問題,那就是 mMap.value[3] 對應(yīng)的 key 值是多少?在上述斷點(diǎn)界面根本就差看不到,但是 Android Studio 是很強(qiáng)大的,只是你沒發(fā)現(xiàn)而已,既然 mMap 是一個 Map,那么久能通過 keySet() 方法獲取 Map 的 key。接下來就是 Android Studio 大展拳腳的時間。
如上圖所示的,在 Debug 界面,點(diǎn)擊最后一個圖標(biāo):Evaluate Expression(快捷鍵:option + f8)。在彈出的對話框中輸入如下內(nèi)容,回車,你會發(fā)現(xiàn) Map 的 key 都出來了:
通過與第一幅圖對比,發(fā)現(xiàn)下標(biāo)為3的值(share_screenshot_as_stream)為我們需要的 key。
布局比較簡單,這里就不貼了,簡單截取 BrowserSrceenShotActivity.java 中的代碼:
@Override
protected 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 以上測試崩潰
//https://thinkandroid.wordpress.com/2012/08/07/granting-content-provider-uri-permissions/
//第一個參數(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é)果如下:
對于獲取 Chrome 瀏覽器分享頁面的截屏就告一段落,閑著沒事,自己又測試了幾個瀏覽器,包括系統(tǒng)內(nèi)置瀏覽器、QQ瀏覽器、UC瀏覽器、百度瀏覽器、火狐瀏覽器,發(fā)現(xiàn)每個瀏覽器的差異很大。
- 系統(tǒng)瀏覽器、UC瀏覽器與 Chrome 相差不大,只是 key 變成了 share_full_screen 和 file
- QQ瀏覽器的分享行為與分享文件很相似,其 key 為 android.intent.extra.STREAM(Intent.EXTRA_STREAM)。
- 百度瀏覽器是個什么鬼就不知道了,默默的把應(yīng)用圖標(biāo)給分享過來了
- 火狐瀏覽器不支持分享頁面截圖
恩,就這么多,獲取瀏覽器分享頁面截屏主要還是靠瀏覽器的支持,真的市面上這么多瀏覽器適配起來還真麻煩。這次主要對 Android Studio 強(qiáng)大的 Debug功能進(jìn)行了學(xué)習(xí)。PS:Android Studio真是極其強(qiáng)大的工具,用好它事半功倍,唯一不足的就是太耗性能。
Demo 代碼傳送門:DemoApplication_jb51.rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android截屏方案實(shí)現(xiàn)原理解析
- Android截屏分享功能
- Android 下調(diào)試手機(jī)截屏的方法
- Android 實(shí)現(xiàn)截屏功能的實(shí)例
- android長截屏原理及實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)截屏方式整理(總結(jié))
- Android截屏SurfaceView黑屏問題的解決辦法
- Android截屏截圖的幾種方法總結(jié)
- android中Webview實(shí)現(xiàn)截屏三種方式小結(jié)
- Android實(shí)現(xiàn)矩形區(qū)域截屏的方法
- Android Activity 不能被截屏的解決方法
相關(guān)文章
怎樣實(shí)現(xiàn)android http-post方法實(shí)例說明
android http-post方法在開發(fā)中如何實(shí)現(xiàn),具體代碼如下,感興趣的朋友可以參考下哈,希望對大家有所幫助2013-06-06
Android實(shí)現(xiàn)圖片在屏幕內(nèi)縮放和移動效果
這篇文章主要為大家詳細(xì)介紹了Android控制圖片在屏幕內(nèi)縮放和移動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02
Android PraiseTextView實(shí)現(xiàn)朋友圈點(diǎn)贊功能
這篇文章主要為大家詳細(xì)介紹了PraiseTextView簡單實(shí)現(xiàn)朋友圈點(diǎn)贊功能的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
Android 實(shí)現(xiàn)銀聯(lián)刷卡機(jī)消費(fèi)后手動簽名的功能(示例代碼)
在一些商場購物時,不需要用筆在銀聯(lián)機(jī)上簽名了,直接用手指觸摸實(shí)現(xiàn)消費(fèi)簽名,非常方便,下面小編給大家分享Android 實(shí)現(xiàn)銀聯(lián)刷卡機(jī)消費(fèi)后手動簽名的功能,需要的朋友參考下吧2017-12-12
Android編程實(shí)現(xiàn)監(jiān)控各個程序流量的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)監(jiān)控各個程序流量的方法,涉及Android針對應(yīng)用包的遍歷,權(quán)限控制及相關(guān)屬性操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-12-12
flutter實(shí)現(xiàn)發(fā)送驗證碼功能
這篇文章主要為大家詳細(xì)介紹了flutter發(fā)送驗證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
Android App調(diào)用MediaRecorder實(shí)現(xiàn)錄音功能的實(shí)例
這篇文章主要介紹了Android App調(diào)用MediaRecorder實(shí)現(xiàn)錄音功能的實(shí)例,MediaRecorder非常強(qiáng)大,不僅能夠用來錄制音頻還可以錄制視頻,需要的朋友可以參考下2016-04-04

