在a.apk中打开b.apk

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这次工作中很坑爹地遇到了一个问题:
在一个a.apk中打开另一个b.apk,坑爹的是这b.apk没有入口配置(注:在manifest中没有配置入口activity,即:缺少 <intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="UNCHER" />
</intent-filter>,如果没有这个配置,手机安装上该应用了,当无法找到相应的应用图标,但通过设置里面的已下载应用
中显示它确实已经安装在你的手机上了)。

给出的条件:知道这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;
所需权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
返回: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.pac kage-archive");
MainActivity.this.startActivity(intent);
3.如何在a.apk中打开b.apk。

我觉得这是整的的一个流程中最重要的问题,我们都知道,想要进入一个android 应用的时候,
都必须要有一个入口的配置activity,应用在打开启动的时候会先扫描manifest 文件,只有当
在里面找到入口配置(含<action android:name="android.intent.action.MAIN" /> <category android:name="UNCHER" />的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<PackageInfo> getAllApps(Context context) {
List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
//获取手机内所有应用
List<PackageInfo> 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; }。

相关文档
最新文档