android在只擁有第三方apk的情況下在自己app中開啟第三方app
阿新 • • 發佈:2019-02-19
前提是第三方apk的AndroidManifest的某個activity中的export = "true"
/** * * 開啟另一個app * @param packageName * @param className */ public void goToAnotherApp(String packageName,String className){ Intent intent = new Intent(); if(isAvilible(Main2Activity.this,packageName)){ intent.setAction(Intent.ACTION_MAIN); //前提:知道要跳轉應用的包名、類名 ComponentName componentName = new ComponentName(packageName, className); intent.setComponent(componentName); startActivity(intent); }else{ Toast.makeText(Main2Activity.this, "沒有該應用", Toast.LENGTH_SHORT).show(); } } /** * 判斷相對應的APP是否存在 * * @param context * @param packageName(包名)(若想判斷QQ,則改為com.tencent.mobileqq,若想判斷微信,則改為com.tencent.mm) * @return */ public boolean isAvilible(Context context, String packageName) { PackageManager packageManager = context.getPackageManager(); //獲取手機系統的所有APP包名,然後進行一一比較 List<PackageInfo> pinfo = packageManager.getInstalledPackages(0); for (int i = 0; i < pinfo.size(); i++) { if (((PackageInfo) pinfo.get(i)).packageName .equalsIgnoreCase(packageName)) return true; } return false; } /** * 通過已知apk獲取到該app的包名 */ private void getPackageNameByApk() { String FilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "xinga.apk";//輸入APK地址 PackageManager pm = getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(FilePath, PackageManager.GET_ACTIVITIES); if (info != null) { ApplicationInfo appInfo = info.applicationInfo; String appName = pm.getApplicationLabel(appInfo).toString(); String packageName = appInfo.packageName; //獲取安裝包名稱 // com.travelsky.mrt.oneetrip // com.travelsky.mrt.oneetrip.common.WelcomeActivity Log.i("Abel_Test", "包名是:" + packageName); String version = info.versionName; //獲取版本資訊 Log.i("Abel_Tes", "版本資訊:" + version); } } /** * 通過包名獲取app詳細資訊 * @param packagename */ private void doStartApplicationWithPackageName(String packagename) { // 通過包名獲取此APP詳細資訊,包括Activities、services、versioncode、name等等 PackageInfo packageinfo = null; try { packageinfo = getPackageManager().getPackageInfo(packagename, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } if (packageinfo == null) { return; } // 建立一個類別為CATEGORY_LAUNCHER的該包名的Intent Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setPackage(packageinfo.packageName); // 通過getPackageManager()的queryIntentActivities方法遍歷 List<ResolveInfo> resolveinfoList = getPackageManager() .queryIntentActivities(resolveIntent, 0); ResolveInfo resolveinfo = resolveinfoList.iterator().next(); if (resolveinfo != null) { // packagename = 引數packname String packageName = resolveinfo.activityInfo.packageName; // 這個就是我們要找的該APP的LAUNCHER的Activity[組織形式:packagename.mainActivityname] String className = resolveinfo.activityInfo.name; Log.i("Abel_Tes", "版本資訊:" + className); // LAUNCHER Intent Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); // 設定ComponentName引數1:packagename引數2:MainActivity路徑 ComponentName cn = new ComponentName(packageName, className); intent.setComponent(cn); startActivity(intent); } }