Android打开设备上已安装的其它app

一、得到目标app包名

参考链接:https://www.jianshu.com/p/8cc2f0841b14  原作者:亭子青年

  1. 在模拟器/真机上面安装“包名查看器”,可以自行上网搜索
  2. 使用sdk tools下的3个工具进行查看:ddms.bat,monitor.bat,hierarchyviewer.bat,当然也可以通过eclipse中的ddms进行查看,在查看的过程中,你只需要在虚拟机或者真机中打开并操作指定的app,就可以在工具中进行查看

这里以hierarchyviewer.bat工具为例

hierarchyviewer.png

3.通过签名文件获得
(1)adb shell pm list packages
(2)adb shell ls -al /data/data

4.查看源代码=》AndroidManifest.xml文件

二、项目app启动目标app

参考链接:https://www.jianshu.com/p/42ae7066f8f3   作者:吾若成疯

MainActivity.java

扫描二维码关注公众号,回复: 2745370 查看本文章

(packageName:com.xxx.test.debug)

    //点击按钮响应
    public void click(View view){
        //根据包名打开指定app
        //app:Pos  包名:com.xxx.test.debug 
        openTargetApp("com.xxx.test.debug");
    }

    /*
     *启动设备已安装的app
     */
    public void openTargetApp(String packageName){
        //包管理器对象
        PackageManager pm = getPackageManager();
        //检查包名
        PackageInfo packageInfo = null;
        try {
            packageInfo = pm.getPackageInfo(packageName,0);
        }catch (PackageManager.NameNotFoundException e){
            e.printStackTrace();
        }
        //包名存在则启动app
        if (packageInfo != null){
            Intent intent = pm.getLaunchIntentForPackage(packageName);
            this.startActivity(intent);
        }else{
            Toast.makeText(MainActivity.this,"应用程序未安装",Toast.LENGTH_LONG).show();
        }

如果手机上已经安装了另一个APP直接就能够打开了。

2、打开另一个APP指定的Activity

(入口Activity:com.xxx.test.ExampleActivity)

    Intent intent = new Intent();
    //第一种方式
    ComponentName cn = new ComponentName("com.xxx.test.debug", "com.xxx.test.ExampleActivity");
    try {
        intent.setComponent(cn);
        //第二种方式
        //intent.setClassName("com.xxx.test.debug", "com.xxx.test.ExampleActivity");
        intent.putExtra("test", "intent1");
        startActivity(intent);
    } catch (Exception e) {
        //TODO  可以在这里提示用户没有安装应用或找不到指定Activity,或者是做其他的操作
    }

这里有两点需要注意
1、需要将目标Activity的android:exported="true"属性在所属应用AndroidMainfest里设置为true,意思是当前Activity可以被外部应用访问,否则会报下面的错误

  Caused by: java.lang.SecurityException: Permission Denial: starting  Intent 
  { cmp=com.xxx.test.debug/.ExampleActivity (has extras) } from ProcessRecord
  {39282a97 11545:com.xing.toolbardemo1/u0a71}  (pid=11545,     uid=10071) not exported from uid 10067

2、需要在当前应用的AndroidMainfest里也声明目标Activity,否则会报下面的错误
(测试机为android5.0以下)

   Caused by: android.content.ActivityNotFoundException: Unable to find 
   explicit activity class {com.xxx.test.debug/com.xxx.test.debug.ExampleActivity}; 
   have you declared this activity in your AndroidManifest.xml? 

在清单文件里声明目标Activity就OK了

  <activity android:name="com.xxx.test.debug.ExampleActivity"></activity>

猜你喜欢

转载自blog.csdn.net/weixin_40571358/article/details/81455422