在一个a.apk中打开另一个b.apk,坑爹的是这b.apk没有入口配置

这次工作中很坑爹地遇到了一个问题:

成都创新互联公司总部坐落于成都市区,致力网站建设服务有网站设计制作、网站设计、网络营销策划、网页设计、网站维护、公众号搭建、重庆小程序开发、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!

在一个a.apk中打开另一个b.apk,坑爹的是这b.apk没有入口配置(注:在manifest中没有配置入口activity,即:缺少

               

               

           ,如果没有这个配置,手机安装上该应用了,当无法找到相应的应用图标,但通过设置里面的已下载应用

           中显示它确实已经安装在你的手机上了)。给出的条件:知道这b.apk的包名。

以上就是所有的问题内容了。

思路:

1. 将b.apk放在a的project中的assets目录下,将b.apk复制到sd卡中。

2. 解压安装b.apk。

3. 打开b.apk。

需解决的问题已经解决方法:

1.如何如何将b.apk通过程序的方式复制到sd卡。

参数:context:对应activity的上下文;

fileName:b.apk;

path:sd卡存储路径,带b.apk;

所需权限:

返回:true:copy成功

false:copy失败

public boolean copyApkFromAssets(Context context, String fileName,

String path) {

boolean copyIsOK = false;

try {

InputStream is = context.getAssets().open(fileName);

File file = new File(path);

Boolean isExists = file.exists();

if (!isExists) {

file.getParentFile().mkdir();

file.createNewFile();

}

FileOutputStream fos = new FileOutputStream(file);

byte[] temp = new byte[1024];

int i = 0;

while ((i = is.read(temp)) > 0) {

fos.write(temp, 0, i);

}

fos.close();

is.close();

copyIsOK = true;

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return copyIsOK;

}

2.如何通过程序的方式解压安装b.apk。

参数:PATH_APK:保存在sd的b.apk对应的路径,带b.apk

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.setDataAndType(Uri.parse("file://"+PATH_APK),"application/vnd.android.package-archive");

MainActivity.this.startActivity(intent);

3.如何在a.apk中打开b.apk。

我觉得这是整的的一个流程中最重要的问题,我们都知道,想要进入一个android应用的时候,

都必须要有一个入口的配置activity,应用在打开启动的时候会先扫描manifest文件,只有当

在里面找到入口配置(含

               的activity)的时候

   才能启动第一个界面。网上查了一些资料,有好多是知道这个b.apk的包名,同时呢,b.apk的入口配置都是有的。

   这个的话会很好办:

   参数:**.**.**  :  b.apk的包名

     Intent intent = new Intent();

intent = manager.getLaunchIntentForPackage("**.**.**");

if(intent != null){

MainActivity.this.startActivity(intent);

}  

但是!当使用这个方法来进入没有入口配置的应用的时候,不会有任何反应。

我们现在要解决的是没有入口配置的!

思路:虽然没有入口配置,但要是我们直接打开这个首界面的activity,是不是说也能行呢?

需要解决的问题和方法:

  1> 如何知道b.apk的首界面activity

有一种牛逼的软件叫:反编译软件  就是能通过得到的.apk获取到对应的源文件,当然由于被添加标签等加密后,

这源文件反编译过来会出现好多的错误,但是,manifest文件的正常的!在里面,你就能找到啦!

  2> 如何在a.apk中打开b.apk中的mainAvtivity,条件:知道b.apk的包名,mainActivity的包名

参数:  **.**.**:b.apk的包名

**.**.**.activity.MainActivity:MainActivity的全名(加有包名)

Intent mIntent = new Intent( );

mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

       ComponentName comp = new ComponentName("**.**.**", "**.**.**.activity.MainActivity");  

       mIntent.setComponent(comp);  

       mIntent.setAction("android.intent.action.VIEW");  

       startActivity(mIntent);  

    ok!搞定      

    ps:要是不知道b.apk的包名的话,可以搜索安装在手机上的应用的包名来找到:

public  List getAllApps(Context context) {

 List apps = new ArrayList();

 PackageManager pManager = context.getPackageManager();

 //获取手机内所有应用

 List paklist = pManager.getInstalledPackages(0);

 for (int i = 0; i < paklist.size(); i++) {

  PackageInfo pak = (PackageInfo) paklist.get(i);

  //判断是否为非系统预装的应用程序

  if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {

   // customs applications

   apps.add(pak);

  }

 }

 return apps;

}


分享文章:在一个a.apk中打开另一个b.apk,坑爹的是这b.apk没有入口配置
网页链接:http://azwzsj.com/article/jgpcco.html