您好,登錄后才能下訂單哦!
這次工作中很坑爹地遇到了一個(gè)問題:
在一個(gè)a.apk中打開另一個(gè)b.apk,坑爹的是這b.apk沒有入口配置(注:在manifest中沒有配置入口activity,即:缺少 <intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>,如果沒有這個(gè)配置,手機(jī)安裝上該應(yīng)用了,當(dāng)無法找到相應(yīng)的應(yīng)用圖標(biāo),但通過設(shè)置里面的已下載應(yīng)用
中顯示它確實(shí)已經(jīng)安裝在你的手機(jī)上了)。給出的條件:知道這b.apk的包名。
以上就是所有的問題內(nèi)容了。
思路:
1. 將b.apk放在a的project中的assets目錄下,將b.apk復(fù)制到sd卡中。
2. 解壓安裝b.apk。
3. 打開b.apk。
需解決的問題已經(jīng)解決方法:
1.如何如何將b.apk通過程序的方式復(fù)制到sd卡。
參數(shù):context:對(duì)應(yīng)activity的上下文;
fileName:b.apk;
path:sd卡存儲(chǔ)路徑,帶b.apk;
所需權(quán)限: <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。
參數(shù):PATH_APK:保存在sd的b.apk對(duì)應(yīng)的路徑,帶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。
我覺得這是整的的一個(gè)流程中最重要的問題,我們都知道,想要進(jìn)入一個(gè)android應(yīng)用的時(shí)候,
都必須要有一個(gè)入口的配置activity,應(yīng)用在打開啟動(dòng)的時(shí)候會(huì)先掃描manifest文件,只有當(dāng)
在里面找到入口配置(含<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />的activity)的時(shí)候
才能啟動(dòng)第一個(gè)界面。網(wǎng)上查了一些資料,有好多是知道這個(gè)b.apk的包名,同時(shí)呢,b.apk的入口配置都是有的。
這個(gè)的話會(huì)很好辦:
參數(shù):**.**.** : b.apk的包名
Intent intent = new Intent();
intent = manager.getLaunchIntentForPackage("**.**.**");
if(intent != null){
MainActivity.this.startActivity(intent);
}
但是!當(dāng)使用這個(gè)方法來進(jìn)入沒有入口配置的應(yīng)用的時(shí)候,不會(huì)有任何反應(yīng)。
我們現(xiàn)在要解決的是沒有入口配置的!
思路:雖然沒有入口配置,但要是我們直接打開這個(gè)首界面的activity,是不是說也能行呢?
需要解決的問題和方法:
1> 如何知道b.apk的首界面activity
有一種牛逼的軟件叫:反編譯軟件 就是能通過得到的.apk獲取到對(duì)應(yīng)的源文件,當(dāng)然由于被添加標(biāo)簽等加密后,
這源文件反編譯過來會(huì)出現(xiàn)好多的錯(cuò)誤,但是,manifest文件的正常的!在里面,你就能找到啦!
2> 如何在a.apk中打開b.apk中的mainAvtivity,條件:知道b.apk的包名,mainActivity的包名
參數(shù): **.**.**: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的包名的話,可以搜索安裝在手機(jī)上的應(yīng)用的包名來找到:
public List<PackageInfo> getAllApps(Context context) {
List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
//獲取手機(jī)內(nèi)所有應(yīng)用
List<PackageInfo> paklist = pManager.getInstalledPackages(0);
for (int i = 0; i < paklist.size(); i++) {
PackageInfo pak = (PackageInfo) paklist.get(i);
//判斷是否為非系統(tǒng)預(yù)裝的應(yīng)用程序
if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
// customs applications
apps.add(pak);
}
}
return apps;
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。