Android 不一樣的原生分享

来源:http://www.cnblogs.com/HopeGi/archive/2016/05/06/5467248.html
-Advertisement-
Play Games

Android做分享功能百度一下就兩種方案,其一是用系統原生的Activity,最終彈出一個對話框,下麵這種的還好,像右圖的那種就嫌棄了,上面提供的應用也相對雜,還記得有次測試還給鄙人提了個Bug:建議分享中多列舉常用的App如QQ微信等。 那另外一種方案就彌補了上面兩種不足,使用第三方的,如Sha ...


Android做分享功能百度一下就兩種方案,其一是用系統原生的Activity,最終彈出一個對話框,下麵這種的還好,像右圖的那種就嫌棄了,上面提供的應用也相對雜,還記得有次測試還給鄙人提了個Bug:建議分享中多列舉常用的App如QQ微信等。

那另外一種方案就彌補了上面兩種不足,使用第三方的,如ShareSDK,可以自定義界面,可以自己決定有哪些課分享的應用展示出來。但是我還是比較懶地嫌棄了,因為每開發一個引用都需要去申請一個Key,引用一堆的包。

所以我還是想找一個集合上面兩種優勢的方案,直到我看了Android原生的圖庫,我就覺得有希望了。最終試驗結果如下

然後就繼續引來更大的一波嫌棄:

還是那樣的難看,比之前更難看。。。。。。。。。。。

可重點是,現在能把這些分享的應用信息都那得到了,並且也可以順利的分享出去了。那剩下的事情就是把界面做得好看一點,把自己不喜歡的那些應用都篩選掉。實際上剩下的我都不做了。單純講講怎麼拿到這些分享信息數據和分享出去。

由於用的是系統原生的分享,故使用Intent是必不可少的,分享圖片和分享文字的分別如下

1         Intent intent=new Intent(Intent.ACTION_SEND);
2 
3         intent.setType("image/*");
4 
5         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
6 
7         intent.putExtra(Intent.EXTRA_STREAM, uri);

 

1         Intent intent=new Intent(Intent.ACTION_SEND);
2 
3         intent.setType("text/plain");
4 
5         intent.putExtra(Intent.EXTRA_TEXT, sharecontentstring);
6 
7         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

與網上眾多的方法相比,對Flags的設置有所不同,其餘的還是一樣的,接下來的則是不一樣的

 1        List<ResolveInfo> resolveInfo=this.getPackageManager().queryIntentActivities(intent, 0);
 2 
 3         String label;
 4 
 5         Drawable icon;
 6 
 7         ResolveInfo info;
 8 
 9         HashMap<String,Object> item;
10 
11         datasource.clear();
12 
13         for(int i=0;i<resolveInfo.size();i++)
14 
15         {
16 
17             item=new HashMap<String,Object>();
18 
19              info=resolveInfo.get(i);
20 
21              label=info.loadLabel(getPackageManager()).toString();
22 
23              icon= info.loadIcon(getPackageManager());
24 
25              if(this.appNameMapping.containsKey(info.activityInfo.applicationInfo.packageName))
26 
27                  item.put("label", this.appNameMapping.get( info.activityInfo.applicationInfo.packageName)+"——"+label);
28 
29              else
30 
31                  item.put("label", label);
32 
33              item.put("icon", icon );
34 
35              item.put("resolve", resolveInfo.get(i));
36 
37              item.put("intent", intent);
38 
39              datasource.add(item);
40 
41         }

 

通過Context獲取PackageManager,藉助其篩選出符合這種Intent的Activity。得出了ResolveInfo。這個ResolveInfo就包含了分享應用的Activity信息,名稱還有Icon,光靠這些信息就可以分享了,但是鄙人還想直接通過應用名來篩選出不需要顯示在列表中的App,在上述代碼中,appNameMapping就存放著包名和應用名的鍵值對,這個也是通過類似方法獲取的

 1         List<ApplicationInfo> listAppcations = this.getPackageManager()
 2 
 3 .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
 4 
 5         for(ApplicationInfo info :listAppcations)
 6 
 7         {
 8 
 9             appNameMapping.put(info.packageName, info.loadLabel(getPackageManager()));
10 
11         }

 

當選擇好需要分享的應用後,接下來就執行分享操作了

1             ResolveInfo resolve=(ResolveInfo) datasource.get(index).get("resolve");
2 
3             ActivityInfo ai= resolve.activityInfo;
4 
5             Intent intent=new Intent((Intent) datasource.get(index).get("intent"));
6 
7             intent.setComponent( new ComponentName(ai.applicationInfo.packageName,ai.name) );
8 
9             startActivity(intent);

 

數據就如此被分享出去了。

稍微總結一下,這個方式仍有他的弊端,還沒滿足同時分享圖片和文字,如果能做到那就更好了,或者是對Intent瞭解還沒夠深入,這個分享調用主要靠的是Intent,另外則是那堆Info類了。當初學習Android時對Intent瞭解還是很不明不白,Intent終須要徹徹底底地理解一番。本方法暫時未封裝成工具類或組件,各位懂得用的園友們看了也能自己動手做一個,請啊!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在js中有幾種模式可以創建對象,通過對象操作所包含的屬性與方法。 一般來說,構造函數名稱的第一個字母為大寫字母,非構造函數名稱的第一個字母為小寫字母,當然,構造函數與一般函數唯一的區別隻是調用的方式不同而已,所以任何函數只要通過new來調用,那它就可以作為構造函數,若不通過new來調用,則與一般函數 ...
  • 效果: ...
  • 本例子實現彈窗的效果: 1、jquery.show.js "); title=$(" "); content=$(" "); showdiv.html(""); showdiv.append(close); showdiv.append(title); showdiv.append(content) ...
  • 全部學習資源下載:http://pan.baidu.com/s/1eSGy3Qi 效果預覽:http://wjf444128852.github.io/demo/baiduditu/index.html html5里完全支持百度地圖 使用步驟 1、 引入百度地圖的JS * 鏈接 - http://a ...
  • 這次我們來講解第三節知識,考慮了下,先不去講什麼理論了,畢竟網上一搜一大堆,而且理論真心看不太懂啊!!! 今天我們就直接上實例嘍! 大家HIGH起來!!!(想了好久,還是沒捨得刪這句話) 1.根據下圖配置自己的文件 2.我們先用原始方法 額,忘記告訴大家做什麼項目了,那就在這補上吧,咱們先做一個小D ...
  • 在一個類的實例記憶體被釋放之前,析構方法被立即調用。使用deinit關鍵字來聲明析構方法,類似於構造方法用init來聲明。析構方法只適用於類類型。 析構方法原理 Swift會自動釋放不再需要的實例以釋放資源。如自動引用計數那一章描述,Swift通過自動引用計數(ARC)處理實例的記憶體管理。不需要手動的 ...
  • 在Android中,視圖控制項大致被分為兩類,即ViewGroup和View,ViewGroup控制項作為父控制項,包含並管理著子View,通過ViewGroup和View便形成了控制項樹,各個ViewGoup對象和View對象就是控制項樹中的節點。在控制項樹中,以樹的深度來遍歷查找對應的控制項元素,同時,上層控 ...
  • 源代碼管理工具SVN是一款非常強大的源代碼管理工具,現在國內70%-90%的公司都在使用SVN來管理源代碼,下麵就讓小編給大家著重介紹一下SVN的使用,SVN的使用主要分為下麵幾塊。 SVN的使用環境 伺服器端的配置 客戶端軟體的使用 客戶端圖形界面工具的使用 SVN的目錄規範及使用實例 1.SVN ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...