美文网首页
Android 通过系统API 实现分享功能

Android 通过系统API 实现分享功能

作者: __素颜__ | 来源:发表于2020-04-22 17:00 被阅读0次
    一. 通过系统API 实现分享
    1、 应用如何对外有分享功能的?

    如果应用的AndroidManifest.xml 中配有ACTION_SEND 属性,那就证明该应用可以供第三方应用调用进行分享。

    2、如何获取含有该属性的应用列表?

    通过向系统发送指定内容的隐式意图, 来获取含有该action 的应用。通过PackageManager中queryIntentActivities() 获取应用含有该意图的应用列表。

    二.代码实现
    1、获取分享列表
    public List<AppInfoVo> getShareApps() {
            List<AppInfoVo> appInfoVos = new ArrayList<AppInfoVo>();
            if (mWeak == null || mWeak.get() == null) {
                return appInfoVos;
            }
            PackageManager packageManager = mWeak.get().getPackageManager();
            List<ResolveInfo> resolveInfoList = new ArrayList<ResolveInfo>();
            Intent intent = new Intent(Intent.ACTION_SEND, null);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setType("*/*");
            PackageManager pManager = mWeak.get().getPackageManager();
            resolveInfoList = pManager.queryIntentActivities(intent, 0);
            for (int i = 0; i < resolveInfoList.size(); i++) {
                AppInfoVo appInfoVo = new AppInfoVo();
                ResolveInfo resolveInfo = resolveInfoList.get(i);
                appInfoVo.setAppName(resolveInfo.loadLabel(packageManager).toString());
                appInfoVo.setIcon(resolveInfo.loadIcon(packageManager));
                appInfoVo.setPackageName(resolveInfo.activityInfo.packageName);
                appInfoVo.setLauncherName(resolveInfo.activityInfo.name);
                appInfoVos.add(appInfoVo);
            }
            return appInfoVos;
        }
    
    public class AppInfoVo {
      
       private Drawable icon;
        private String appName;
        private String packageName;
        private String launcherName;
    }
    

    ResolveInfo这个类是通过解析与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的< intent>标签收集到的信息。得到List列表后转成自己建的AppInfoVo类,方便后面使用

    2、初始化弹窗
    public class SharePopupWindow extends PopupWindow {
        public static final int MASK_COLOR = Color.argb(0x00, 0, 0, 0);
        private View mMenuView;
        private GridView mGridView;
        private TextView mTextViewClose;
        private AppInfoAdapter mAdapter;
    
        private List<AppInfoVo> mAppInfoList;
        private List<AppInfoVo> mMainAppsList;
        private List<AppInfoVo> mShowAppsList = new ArrayList<>();
        private OnShareItemClickListener mOnShareItemClickListener;
    
        private Activity mActivity;
        public View mRootView;
    
        public SharePopupWindow(Activity activity, final List<AppInfoVo> mAppInfoList, List<AppInfoVo> mainAppsList) {
            super(LayoutInflater.from(activity).inflate(R.layout.pop_device_share, null, false), ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true);
            mRootView = getContentView();
            this.mAppInfoList = mAppInfoList;
            this.mMainAppsList = mainAppsList;
            this.mActivity = activity;
    
            mGridView = (GridView) mRootView.findViewById(R.id.grid_app);
            mTextViewClose = (TextView) mRootView.findViewById(R.id.tv_close);
    
            mShowAppsList.clear();
            mShowAppsList.addAll(mainAppsList);
    
            //如果主要app为空直接设置全部可分享设备
            if (mainAppsList.isEmpty() || mainAppsList.size() == 1) {
                mShowAppsList.addAll(mAppInfoList);
            }
            mAdapter = new AppInfoAdapter(mActivity, mShowAppsList);
            mGridView.setAdapter(mAdapter);
            changeGridView(mActivity);
    
            mGridView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                    AppInfoVo mAppInfoVo = mShowAppsList.get(position);
                    if (TextUtils.isEmpty(mAppInfoVo.getPackageName())) { //点击更多
                        mShowAppsList.clear();
                        mShowAppsList.addAll(mAppInfoList);
                        mAdapter.notifyDataSetChanged();
                        changeGridView(mActivity);
                    } else { //点击app
                        if (mOnShareItemClickListener != null) {
                            mOnShareItemClickListener.onShareItemClick(position, mAppInfoVo);
                        }
                    }
                }
            });
    
            mTextViewClose.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    dismiss();
                }
            });
        }
    
        /**
         * 将GridView改成单行横向布局
         */
        private void changeGridView(Context context) {
            if (mShowAppsList.size() != mAppInfoList.size()) {
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getScreenWidthDimension(mActivity), LinearLayout.LayoutParams.MATCH_PARENT);
                mGridView.setLayoutParams(params);
                return;
            }
            // 1.item宽度
            int itemWidth = dp2px(100, context);
            // 2.item之间的间隔
            int itemPaddingH = dp2px(1, context);
            int size = mShowAppsList.size();
            // 3.计算GridView宽度
            int gridviewWidth = size / 2 * (itemWidth + itemPaddingH);
            // 4.设置mGridView
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(gridviewWidth, LinearLayout.LayoutParams.MATCH_PARENT);
            mGridView.setLayoutParams(params);
            mGridView.setColumnWidth(itemWidth);
            mGridView.setHorizontalSpacing(itemPaddingH);
            mGridView.setStretchMode(GridView.NO_STRETCH);
            mGridView.setNumColumns(size / 2);
        }
     
        public interface OnShareItemClickListener {
            void onShareItemClick(int position, AppInfoVo mAppInfoVo);
        }
    
        public void setOnShareItemClickListener(OnShareItemClickListener mOnShareItemClickListener) {
            this.mOnShareItemClickListener = mOnShareItemClickListener;
        }
    }
    
    • 效果图


      分享.gif
    三.项目地址

    相关文章

      网友评论

          本文标题:Android 通过系统API 实现分享功能

          本文链接:https://www.haomeiwen.com/subject/fhniihtx.html