一、发送参数应用
这里打开第三方应用(第三方支持并且接收参数),
参数说明:
packageName 第三方包名 ,account,verifyTime ,sign ,传递给第三方的参数
public void openApp(String packageName, String account,String verifyTime ,String sign) {
PackageManager packageManager = mContext.getPackageManager();
PackageInfo pi = null;
try {
pi = packageManager.getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);
List<ResolveInfo> apps = packageManager.queryIntentActivities(resolveIntent, 0);
ResolveInfo ri = apps.iterator().next();
if (ri != null) {
String className = ri.activityInfo.name;
String path = "comcpscapps://open/appInfo?account_name=" + account+"&verify_time="+verifyTime+"&sign="+sign;
Uri uri = Uri.parse(path);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
mContext.startActivity(intent);
}
}
二、接收参数的App
1.在AndroidManifest.xml中,在app入口的activity 中添加 android:exported="true" 属性
<intent-filter>
<data android:scheme="comcpscapps" android:host="open" android:path="/appInfo"/>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
如下图所示:
![](https://img.haomeiwen.com/i5915124/d5973b3481f674c7.jpg)
2在入口activity中获取传递过来的参数
Uri uri = getIntent().getData();
if (uri != null) {
String url = uri.toString(); // 完整的url信息
String scheme = uri.getScheme(); // scheme部分
String host = uri.getHost(); // host部分
String path = uri.getPath();// 访问路劲
//获取指定参数值
String account = uri.getQueryParameter("account_name");
String verifyTime = uri.getQueryParameter("verify_time");
String sign = uri.getQueryParameter("sign");
test.setText("account:" + account + "\r\n" + "verifyTime:" + verifyTime + "\r\n" + "sign:" + sign);
} else {
test.setText("-2");
}
3.接收参数结果
1)成功
![](https://img.haomeiwen.com/i5915124/679e074ee109c06a.jpg)
2 ) 第三方不是工作应用App或者接收失败
不是工作应用
![](https://img.haomeiwen.com/i5915124/731b554a91e7bd21.jpg)
接收失败,默认-2
![](https://img.haomeiwen.com/i5915124/1053c14c53f4f671.jpg)
扫描手机上的第三方App
public class AppMangerUtil {
private Context mContext;
public AppMangerUtil(Context context) {
mContext = context;
}
private static AppMangerUtil newIntance;
public static AppMangerUtil create(Context context) {
if (newIntance == null) {
synchronized (AppMangerUtil.class) {
if (newIntance == null) {
newIntance = new AppMangerUtil(context);
}
}
}
return newIntance;
}
public ArrayList<AppInfo> getInfoList() {
ArrayList<AppInfo> appInfos = new ArrayList<>();
PackageManager packageManager = mContext.getPackageManager();
List<ApplicationInfo> installedApplications = packageManager.getInstalledApplications(0);
for (int i = 0; i < installedApplications.size(); i++) {
AppInfo appInfo = new AppInfo();
ApplicationInfo applicationInfo = installedApplications.get(i);
if ((ApplicationInfo.FLAG_SYSTEM & applicationInfo.flags) != 0) {
continue;
}
String info = applicationInfo.toString();
String[] split = info.split(" ");
String[] split1 = split[1].split("\\}");
String packageName = split1[0];
if (packageName.equals("com.cpsc.managerapp") || packageName.equals("com.cpsc.managerapps")) {
continue;
}
String appName = getProgramNameByPackageName(packageName);
appInfo.setAppName(appName);
appInfo.setPackageName(packageName);
if (applicationInfo.loadIcon(packageManager) == null) {
continue;
}
Drawable appDrawable = getAppIcon(packageName);
appInfo.setAppDrawable(appDrawable);
appInfos.add(appInfo);
}
return appInfos;
}
public String getProgramNameByPackageName(String packageName) {
PackageManager pm = mContext.getPackageManager();
String name = null;
try {
name = pm.getApplicationLabel(pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA)).toString();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return name;
}
public Drawable getAppIcon(String packName) {
try {
//包管理操作管理类
PackageManager pm = mContext.getPackageManager();
//获取到应用信息
ApplicationInfo info = pm.getApplicationInfo(packName, 0);
return info.loadIcon(pm);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
public void openApp(String packageName, String account,String verifyTime ,String sign) {
PackageManager packageManager = mContext.getPackageManager();
PackageInfo pi = null;
try {
pi = packageManager.getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);
List<ResolveInfo> apps = packageManager.queryIntentActivities(resolveIntent, 0);
ResolveInfo ri = apps.iterator().next();
if (ri != null) {
String className = ri.activityInfo.name;
String path = "comcpscapps://open/appInfo?account_name=" + account+"&verify_time="+verifyTime+"&sign="+sign;
Uri uri = Uri.parse(path);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
mContext.startActivity(intent);
}
}
}
AppInfo Bean
public class AppInfo implements Parcelable{
private String packageName;
private String appName;
private Drawable appDrawable;
protected AppInfo(Parcel in) {
packageName = in.readString();
appName = in.readString();
}
public AppInfo() {
}
public static final Creator<AppInfo> CREATOR = new Creator<AppInfo>() {
@Override
public AppInfo createFromParcel(Parcel in) {
return new AppInfo(in);
}
@Override
public AppInfo[] newArray(int size) {
return new AppInfo[size];
}
};
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public Drawable getAppDrawable() {
return appDrawable;
}
public void setAppDrawable(Drawable appDrawable) {
this.appDrawable = appDrawable;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(packageName);
parcel.writeString(appName);
}
}
备注:具体原理,参考 https://www.jianshu.com/p/da801097c79d
网友评论