Android获取分享应用列表详解及实例

作者:lqh 时间:2023-11-17 05:47:47 

Android获取分享应用列表详解及实例

如果在应用的AndroidManifest.xml中含有 ACTION_SEND 属性,那就证明该应用可以供第三方应用进行调用分享,那怎么获取函数该属性的分享列表了,这对我们做应用的非常有用;最近在做该功能,自己也做了下自定义的分享列表,用PopupWindow的方式弹出。

    1、布局:

popup_share.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"  
 android:layout_height="wrap_content" >
<ListView  
   android:id="@+id/share_list"  
   android:background="#2F4F4F"  
   android:fadingEdge="none"  
   android:layout_width="fill_parent"  
   android:layout_height="wrap_content"  
   android:cacheColorHint="#00000000"  
   android:divider="#E2DD75"  
   android:dividerHeight="1.0dip"  
   android:headerDividersEnabled="true"  
   android:footerDividersEnabled="false" />
</LinearLayout>

popup_share_item.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:gravity="center_vertical"  
 android:layout_width="wrap_content"  
 android:layout_height="wrap_content"  
 android:padding="2.0dip" >
 <ImageView  
   android:id="@+id/share_item_icon"  
   android:layout_width="32.0dip"  
   android:layout_height="32.0dip"  
   android:layout_marginLeft="3.0dip"  
   android:scaleType="fitXY" />
 <TextView  
   android:id="@+id/share_item_name"  
   android:gravity="center"  
   android:layout_width="wrap_content"  
   android:layout_height="wrap_content"  
   android:text="分享"  
   android:textColor="@color/white"  
   android:singleLine="true"  
   android:textSize="@dimen/s_size"  
   android:layout_marginLeft="3.0dip"  
   android:layout_marginRight="3.0dip" />
</LinearLayout>

2、查询手机内所有支持分享的应用列表


public List<ResolveInfo> getShareApps(Context context) {  
   List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
   Intent intent = new Intent(Intent.ACTION_SEND, null);
   intent.addCategory(Intent.CATEGORY_DEFAULT);
   intent.setType("text/plain");
//   intent.setType("*/*");
   PackageManager pManager = context.getPackageManager();
   mApps = pManager.queryIntentActivities(intent,  
       PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
   return mApps;
 }

注:ApplicationInfo是从一个特定的应用得到的信息。这些信息是从相对应的Androdimanifest.xml的< application>标签中收集到的。

ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的< intent>标签收集到的信息。

得到List列表,我自建的AppInfo类,自己建一个就行


private List<AppInfo> getShareAppList() {  
   List<AppInfo> shareAppInfos = new ArrayList<AppInfo>();
   PackageManager packageManager = getPackageManager();
   List<ResolveInfo> resolveInfos = getShareApps(mContext);
   if (null == resolveInfos) {
     return null;
   } else {
     for (ResolveInfo resolveInfo : resolveInfos) {
       AppInfo appInfo = new AppInfo();
       appInfo.setAppPkgName(resolveInfo.activityInfo.packageName);
//       showLog_I(TAG, "pkg>" + resolveInfo.activityInfo.packageName + ";name>" + resolveInfo.activityInfo.name);
       appInfo.setAppLauncherClassName(resolveInfo.activityInfo.name);
       appInfo.setAppName(resolveInfo.loadLabel(packageManager).toString());
       appInfo.setAppIcon(resolveInfo.loadIcon(packageManager));
       shareAppInfos.add(appInfo);
     }
   }    
   return shareAppInfos;
 }

3、弹出PopupWindow的实现


private void initSharePopupWindow(View parent) {
   PopupWindow sharePopupWindow = null;
   View view = null;
   ListView shareList = null;
   if(null == sharePopupWindow) {
     //加载布局文件
     view = LayoutInflater.from(DetailExchangeActivity.this).inflate(R.layout.popup_share, null);
     shareList = (ListView) view.findViewById(R.id.share_list);
     List<AppInfo> shareAppInfos = getShareAppList();
     final ShareCustomAdapter adapter = new ShareCustomAdapter(mContext, shareAppInfos);
     shareList.setAdapter(adapter);

shareList.setOnItemClickListener(new OnItemClickListener() {

@Override
       public void onItemClick(AdapterView<?> parent, View view,
           int position, long id) {
         // TODO Auto-generated method stub
         Intent shareIntent = new Intent(Intent.ACTION_SEND);
         AppInfo appInfo = (AppInfo) adapter.getItem(position);
         shareIntent.setComponent(new ComponentName(appInfo.getAppPkgName(), appInfo.getAppLauncherClassName()));
         shareIntent.setType("text/plain");
//         shareIntent.setType("*/*");
         //这里就是组织内容了,
         shareIntent.putExtra(Intent.EXTRA_TEXT, "test");
         shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         DetailExchangeActivity.this.startActivity(shareIntent);
       }
     });

sharePopupWindow = new PopupWindow(view,  
         (int)(160 * density), LinearLayout.LayoutParams.WRAP_CONTENT);
   }
   //使其聚焦
   sharePopupWindow.setFocusable(true);
   //设置允许在外点击消失
   sharePopupWindow.setOutsideTouchable(true);
   // 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景
   sharePopupWindow.setBackgroundDrawable(new BitmapDrawable());
   //xoff,yoff基于anchor的左下角进行偏移。正数表示下方右边,负数表示(上方左边)
   //showAsDropDown(parent, xPos, yPos);
   sharePopupWindow.showAsDropDown(parent, -5, 5);
 }

注:ShareCustomAdapter自己建一个就行了。(显示会有一个图标和一个分享的名字)

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://blog.csdn.net/zeng622peng/article/details/52005082

标签:Android,分享应用
0
投稿

猜你喜欢

  • SpringCloud让微服务实现指定程序调用

    2022-03-05 23:24:15
  • 全面分析Java文件上传

    2021-12-09 13:22:52
  • JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    2023-09-17 17:03:59
  • C#采用OpenXml实现给word文档添加文字

    2022-06-13 09:48:46
  • Java MongoDB数据库连接方法梳理

    2023-11-25 01:01:20
  • spring配置不扫描service层的原因解答

    2022-03-24 16:35:02
  • Spring Cloud Alibaba Nacos Config配置中心实现

    2022-08-02 00:43:05
  • SpringBoot整合liquibase及liquibase生成初始化脚本的方式

    2023-07-29 11:53:18
  • Java实现雪花算法(snowflake)

    2022-10-27 03:43:23
  • java数组元素的引用实例讲解

    2023-12-02 16:40:32
  • c# 将Minio.exe注册成windows服务

    2022-09-25 20:51:18
  • SpringBoot实现接口数据的加解密功能

    2023-06-30 00:11:01
  • C++版本基于ros将文件夹中的图像转换为bag包

    2021-11-13 07:15:59
  • 深入浅析Mybatis的缺陷问题

    2023-07-19 19:39:46
  • 一文带你学会Spring JDBC的使用

    2023-11-29 17:05:34
  • SpringBoot深入分析讲解监听器模式上

    2022-06-25 21:04:04
  • 最近较流行的效果 Android自定义View实现倾斜列表/图片

    2021-09-06 03:56:51
  • Springboot整合MybatisPlus的实现过程解析

    2021-06-14 02:47:06
  • android图库播放幻灯片时按power键灭屏再亮屏显示keyguard

    2023-11-03 04:32:55
  • Java中BigDecimal类的add()的使用详解

    2023-03-07 16:12:11
  • asp之家 软件编程 m.aspxhome.com