国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 獲取瀏覽器當前分享頁面的截屏示例

2019-12-12 03:39:00
字體:
供稿:網(wǎ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 中對應的 Key 我們并不知道,那怎么辦呢?打斷點啊!

 

通過斷點查看 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] 對應的 key 值是多少?在上述斷點界面根本就差看不到,但是 Android Studio 是很強大的,只是你沒發(fā)現(xiàn)而已,既然 mMap 是一個 Map,那么久能通過 keySet() 方法獲取 Map 的 key。接下來就是 Android Studio 大展拳腳的時間。

 

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

 

通過與第一幅圖對比,發(fā)現(xiàn)下標為3的值(share_screenshot_as_stream)為我們需要的 key。

布局比較簡單,這里就不貼了,簡單截取 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 以上測試崩潰    //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();  }}

運行結(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)。
  • 百度瀏覽器是個什么鬼就不知道了,默默的把應用圖標給分享過來了
  • 火狐瀏覽器不支持分享頁面截圖

恩,就這么多,獲取瀏覽器分享頁面截屏主要還是靠瀏覽器的支持,真的市面上這么多瀏覽器適配起來還真麻煩。這次主要對 Android Studio 強大的 Debug功能進行了學習。PS:Android Studio真是極其強大的工具,用好它事半功倍,唯一不足的就是太耗性能。

Demo 代碼傳送門:DemoApplication_jb51.rar

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄯善县| 鄱阳县| 石柱| 宣威市| 青冈县| 曲阜市| 理塘县| 大同县| 弥渡县| 沁源县| 临沭县| 兰考县| 游戏| 徐闻县| 洛隆县| 淅川县| 台湾省| 土默特右旗| 沙坪坝区| 易门县| 云龙县| 河北省| 博客| 枞阳县| 南汇区| 清镇市| 吐鲁番市| 根河市| 习水县| 甘洛县| 新津县| 阜宁县| 泗阳县| 平武县| 平江县| 塘沽区| 大余县| 黄陵县| 昌都县| 荣昌县| 秦皇岛市|