美文网首页半栈工程师
Android业务组件化之URL Scheme实例

Android业务组件化之URL Scheme实例

作者: 火星局 | 来源:发表于2018-04-19 17:10 被阅读4次

一、发送参数应用

这里打开第三方应用(第三方支持并且接收参数),
参数说明:
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>

如下图所示:


QQ截图20180419171358.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)成功


QQ截图20180419171543.jpg

2 ) 第三方不是工作应用App或者接收失败

不是工作应用

QQ截图20180419171703.jpg

接收失败,默认-2

QQ截图20180419171715.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

相关文章

网友评论

    本文标题:Android业务组件化之URL Scheme实例

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