一. 通过系统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
网友评论