1. 程式人生 > >如何通過Intent啟動一個已經安裝好的APP

如何通過Intent啟動一個已經安裝好的APP

首先你需要一個工具來提取APK的包名,我們要用到的工具是APK helper 該工具將APK安裝包拖到窗體上後,便可顯示APK的包名等詳細資訊。

得到包名以後 用以下程式碼,即可


private void doStartApplicationWithPackageName(String packagename) {


		// 通過包名獲取此APP詳細資訊,包括Activities、services、versioncode、name等等
		PackageInfo packageinfo = null;
		try {
			packageinfo = getPackageManager().getPackageInfo(packagename, 0);
		} catch (NameNotFoundException e) {
			e.printStackTrace();
			Builder builder = new Builder(this);
			builder.setTitle("提示");
			builder.setMessage("找不到印表機應用,是否現在安裝");
			builder.setNegativeButton("取消", null);
			builder.setPositiveButton("確定", new OnClickListener() {


				@Override
				public void onClick(DialogInterface arg0, int arg1) {
					// TODO Auto-generated method stub
					File file = null;
					try {
						file = Util.getAPKfile(Photo2Activity.this);
						Intent intent = new Intent();
						intent.setAction(Intent.ACTION_VIEW);
						intent.setDataAndType(Uri.fromFile(file),
								"application/vnd.android.package-archive");
						startActivity(intent);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}


				}
			});
			builder.show();


		}
		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;
			// 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);
		}
	}


若第一次啟動沒有安裝該APP,可將該APK包放到res/raw目錄下,通過

public static File getAPKfile(Context context) throws IOException {
		File file = new File(getTempPicFolder(), Contants.tempAPK);
		if (!file.exists()) {
			file.createNewFile();
		}
		InputStream is = context.getResources().openRawResource(R.raw.print2);
		FileOutputStream fos = new FileOutputStream(file);


		byte[] buffer = new byte[1024];
		int len = -1;
		while ((len = is.read(buffer)) != -1) {
			fos.write(buffer, 0, len);
		}


		return file;
	}


並通過

file = Util.getAPKfile(Photo2Activity.this);
						Intent intent = new Intent();
						intent.setAction(Intent.ACTION_VIEW);
						intent.setDataAndType(Uri.fromFile(file),
								"application/vnd.android.package-archive");
						startActivity(intent);
<span style="text-align: center; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">啟動一個安裝程式,安裝該APK包</span>