亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android如何實現系統分享的自定義功能

發布時間:2021-07-10 10:22:12 來源:億速云 閱讀:434 作者:小新 欄目:移動開發

小編給大家分享一下android如何實現系統分享的自定義功能,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

分享功能是app中特別常見的功能,國內的app基本都支持分享到微信 QQ等主流的社交應用。至于分享功能的實現大多是使用第三方的share sdk一步到位,或者分享的app比較少比如就一個微信 那通常使用微信sdk的分享模塊即可。但其實android系統就給我們提供過一種分享的實現方式,代碼也比較簡單如下

Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("text/plain");
    share.putExtra(Intent.EXTRA_TEXT, shareText);
    share.putExtra(Intent.EXTRA_SUBJECT, shareSubject);

    if (uri != null) {
      share.setType("image/*");
      share.putExtra(Intent.EXTRA_STREAM, uri);
    }
    context.startActivity(Intent.createChooser(share, title));

android如何實現系統分享的自定義功能

系統提供的短短不到十行代碼,將分享列表 數據 展示 點擊 跳轉 跳轉后分享內容的分享等一系列動作都集合完成了。這樣確實給人干凈利索的感覺,但隨之問題也來了比如我分享列表中只有特定幾個app,甚至把某個app放在第一個,還有點擊Facebook的分享后分享方式我想用facebooksdk自帶的,等等一些列自定義功能完成就比較麻煩。

對個別app的分享特別處理

從以上的代碼可以看出,google官方定義出分享的key value一一對應規則。比如Intent.EXTRA_STREAM對應為分享圖片的uri,Intent.EXTRA_TEXT對應為分享的text文本。從道理上講如果分享到的app都遵循google定義的這規則我們就能通過官方這代碼實現分享到所有app的功能。然而理想很豐滿現實很骨感,比如我們項目中要求分享到的facebook就壓根不遵守這規則,我們想實現分享到Facebook就必須用其sdk實現。于是我們就需要在分享列表中點擊Facebook是單獨走Facebook的分享邏輯。

  • 常規思維這是一個列表,我們監聽列表item的點擊事件即可,然而從實現該分享列表的代碼 可以看出沒有類似listview recyclerview控件,也沒有adapter,扒了下源碼和google找不到item的點擊事件的監聽,故該方案放棄了

  • 所以只能采用了自己實現分享列表,然后監聽分享列表item點擊事件單獨處理的方式,也是符合常規思路

第一步:獲取分享列表的數據

private static List<List<ResolveInfo>> getShareActivities() {
    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    sharingIntent.setType("text/plain");
    PackageManager pm = App.getInstance().getPackageManager();
    List<List<ResolveInfo>> listArrayList = new ArrayList<>();
    List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);
    List<ResolveInfo> newActivityList = new ArrayList<>();

    for (Iterator<ResolveInfo> it = activityList.iterator(); it.hasNext(); ) {
      ResolveInfo info = it.next();
      //過濾出facebook google+ whatapp twitter 分享app單獨處理
      LogUtils.e("+++", info.activityInfo.packageName);
      if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc") || info.activityInfo.packageName.equals("com.facebook.katana") || info.activityInfo.packageName.equals("com.google.android.apps.plus") || info.activityInfo.packageName.equals("com.facebook.orca") || info.activityInfo.packageName.contains("whatsapp") || info.activityInfo.packageName.equals("com.twitter.android")) {
        if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc")) {
          it.remove();
        } else {
          newActivityList.add(info);
          it.remove();
        }
      }
    }
    //增加一條other數據
    newActivityList.add(null);
    listArrayList.add(newActivityList);
    listArrayList.add(activityList);
    return listArrayList;
  }

第二步:構建分享的列表,且定義點擊事件等

public static void systemShareDialog(List<ResolveInfo> packages, Context context, String title, String shareText) {
    List<Intent> targetIntents = new ArrayList<Intent>();
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    SPM spm = new SPM();

    for (ResolveInfo candidate : packages) {
      String packageName = candidate.activityInfo.packageName;
      Intent target = new Intent(android.content.Intent.ACTION_SEND);
      target.setType("text/plain");
      target.putExtra(Intent.EXTRA_TEXT, shareText);
      //target.setPackage(packageName);
      //t will be able to handle the case of multiple activities within the same app that can handle this intent. Otherwise, a weird item of "Android System" will be shown
      target.setComponent(new ComponentName(packageName, candidate.activityInfo.name));

      targetIntents.add(target);
    }
//    createchooser時使用targetIntents.remove(0)即傳入targetIntents的第一個intent,并將其移除,
//
//    否則執行chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[] {}));添加后啟動時會出現兩個相同的應用
    Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), title);
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{}));
    context.startActivity(chooserIntent);

  }

看完了這篇文章,相信你對“android如何實現系統分享的自定義功能”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江津市| 克山县| 平南县| 阳朔县| 巴马| 吴川市| 永定县| 宁蒗| 西青区| 化德县| 大邑县| 沛县| 普兰县| 区。| 盘锦市| 弋阳县| 乐昌市| 抚宁县| 磴口县| 贵南县| 奈曼旗| 焦作市| 昭平县| 南澳县| 增城市| 沾化县| 东海县| 大英县| 广河县| 老河口市| 武川县| 观塘区| 邵阳县| 张家川| 怀安县| SHOW| 广南县| 休宁县| 凭祥市| 穆棱市| 五台县|