Tôi muốn khởi chạy gói cài đặt từ ứng dụng Android của mình. Tôi cho rằng có thể sử dụng ý định, nhưng tôi không tìm ra cách nào để làm điều đó. Có một liên kết, nơi để tìm thông tin?
Tôi muốn khởi chạy gói cài đặt từ ứng dụng Android của mình. Tôi cho rằng có thể sử dụng ý định, nhưng tôi không tìm ra cách nào để làm điều đó. Có một liên kết, nơi để tìm thông tin?
Câu trả lời:
Nếu bạn không biết hoạt động chính, thì tên gói có thể được sử dụng để khởi chạy ứng dụng.
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) {
startActivity(launchIntent);//null pointer check in case package name was not found
}
CATEGORY_INFO
và tiếp theo là một hoạt động chính trong danh mục CATEGORY_LAUNCHER
. Trả về null nếu không tìm thấy. "
Tôi biết điều này đã được trả lời nhưng đây là cách tôi thực hiện một cái gì đó tương tự:
Intent intent = getPackageManager().getLaunchIntentForPackage("com.package.name");
if (intent != null) {
// We found the activity now start the activity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
// Bring user to the market or let them choose an app?
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + "com.package.name"));
startActivity(intent);
}
Thậm chí tốt hơn, đây là phương pháp:
public void startNewActivity(Context context, String packageName) {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (intent != null) {
// We found the activity now start the activity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} else {
// Bring user to the market or let them choose an app?
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
}
}
Đã xóa mã trùng lặp:
public void startNewActivity(Context context, String packageName) {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (intent == null) {
// Bring user to the market or let them choose an app?
intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + packageName));
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
Tôi tìm thấy giải pháp. Trong tệp kê khai của ứng dụng, tôi tìm thấy tên gói: com.package.address và tên của hoạt động chính mà tôi muốn khởi chạy: MainActivity Đoạn mã sau khởi động ứng dụng này:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity"));
startActivity(intent);
// in onCreate method
String appName = "Gmail";
String packageName = "com.google.android.gm";
openApp(context, appName, packageName);
public static void openApp(Context context, String appName, String packageName) {
if (isAppInstalled(context, packageName))
if (isAppEnabled(context, packageName))
context.startActivity(context.getPackageManager().getLaunchIntentForPackage(packageName));
else Toast.makeText(context, appName + " app is not enabled.", Toast.LENGTH_SHORT).show();
else Toast.makeText(context, appName + " app is not installed.", Toast.LENGTH_SHORT).show();
}
private static boolean isAppInstalled(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
try {
pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException ignored) {
}
return false;
}
private static boolean isAppEnabled(Context context, String packageName) {
boolean appStatus = false;
try {
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
if (ai != null) {
appStatus = ai.enabled;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return appStatus;
}
Dưới đây là ví dụ của tôi về việc khởi chạy trình quét mã vạch / mã QR từ ứng dụng của tôi nếu ai đó thấy nó hữu ích
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
try
{
startActivityForResult(intent, SCAN_REQUEST_CODE);
}
catch (ActivityNotFoundException e)
{
//implement prompt dialog asking user to download the package
AlertDialog.Builder downloadDialog = new AlertDialog.Builder(this);
downloadDialog.setTitle(stringTitle);
downloadDialog.setMessage(stringMessage);
downloadDialog.setPositiveButton("yes",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialogInterface, int i)
{
Uri uri = Uri.parse("market://search?q=pname:com.google.zxing.client.android");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try
{
myActivity.this.startActivity(intent);
}
catch (ActivityNotFoundException e)
{
Dialogs.this.showAlert("ERROR", "Google Play Market not found!");
}
}
});
downloadDialog.setNegativeButton("no",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int i)
{
dialog.dismiss();
}
});
downloadDialog.show();
}
Chỉnh sửa tùy theo nhận xét
Trong một số phiên bản - như được đề xuất trong các nhận xét - ngoại lệ được ném có thể khác nhau.
Do đó, giải pháp dưới đây được sửa đổi một chút
Intent launchIntent = null;
try{
launchIntent = getPackageManager().getLaunchIntentForPackage("applicationId");
} catch (Exception ignored) {}
if(launchIntent == null){
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
} else {
startActivity(launchIntent);
}
Câu trả lời gốc
Mặc dù được trả lời tốt, nhưng có một cách thực hiện khá đơn giản xử lý nếu ứng dụng không được cài đặt. Tôi làm nó như thế này
try{
startActivity(getPackageManager().getLaunchIntentForPackage("applicationId"));
} catch (PackageManager.NameNotFoundException e) {
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
}
Thay thế "applicationId" bằng gói bạn muốn mở, chẳng hạn như com.google.maps, v.v.
PackageManager.getLaunchIntentForPackage(...)
trở về phương pháp vô giá trị nếu tên gói không được công nhận. Nó không ném PackageManager.NameNotFoundException
. Xem ở đây .
startActivity(null)
trên trình giả lập Android 10 và nó ném a NullPointerException
chứ không phải a PackageManager.NameNotFoundException
.
startActivity(Intent intent)
phương thức khi nó được đưa ra là null Intent
và điều gì khiến bạn nói điều đó? Tài liệu của các nhà phát triển Android chỉ nói rằng nó sẽ ném ActivityNotFoundException
.
// check for the app if it exist in the phone it will lunch it otherwise, it will search for the app in google play app in the phone and to avoid any crash, if no google play app installed in the phone, it will search for the app in the google play store using the browser :
public void onLunchAnotherApp() {
final String appPackageName = getApplicationContext().getPackageName();
Intent intent = getPackageManager().getLaunchIntentForPackage(appPackageName);
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
onGoToAnotherInAppStore(intent, appPackageName);
}
}
public void onGoToAnotherInAppStore(Intent intent, String appPackageName) {
try {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + appPackageName));
startActivity(intent);
} catch (android.content.ActivityNotFoundException anfe) {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName));
startActivity(intent);
}
}
Nếu bạn muốn mở hoạt động cụ thể của một ứng dụng khác, chúng tôi có thể sử dụng ứng dụng này.
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.fuelgauge.PowerUsageSummary");
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try
{
startActivity(intent)
}catch(ActivityNotFoundException e){
Toast.makeText(context,"Activity Not Found",Toast.LENGTH_SHORT).show()
}
Nếu bạn phải cần ứng dụng khác, thay vì hiển thị Toast, bạn có thể hiển thị hộp thoại. Sử dụng hộp thoại, bạn có thể đưa người dùng đến Play-Store để tải xuống ứng dụng cần thiết.
com.android.settings.fuelgauge.PowerUsageSummary
chỉ là một hoạt động-alias của com.android.settings.Settings$PowerUsageSummaryActivity
, và nó đã bị loại bỏ trong Android Pie , vì vậy tôi về Hội chỉnh sửa để làm cho câu trả lời phù hợp này Pie. Lưu ý rằng nó cũng tương thích với phiên bản cũ hơn, xem AOSP cam kết vào ngày 10 tháng 11 năm 2011 af9252849fd94c1f2859c56a4010900ea38a607e, v.v.
Nếu bạn biết dữ liệu và hành động mà gói đã cài đặt phản ứng, bạn chỉ cần thêm các thông tin này vào thể hiện ý định của mình trước khi bắt đầu.
Nếu bạn có quyền truy cập vào AndroidManifest của ứng dụng khác, bạn có thể xem tất cả thông tin cần thiết ở đó.
Các bước để khởi chạy hoạt động mới như sau:
1.Nhận ý định cho gói
2.Nếu ý định là null chuyển hướng người dùng đến playstore
3.Nếu ý định không hoạt động mở
public void launchNewActivity(Context context, String packageName) {
Intent intent = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.CUPCAKE) {
intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
}
if (intent == null) {
try {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
}
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
Có thể bắt đầu hoạt động của một ứng dụng bằng cách sử dụng Intent.setClassName
theo các tài liệu.
Một ví dụ:
val activityName = "com.google.android.apps.muzei.MuzeiActivity" // target activity name
val packageName = "net.nurik.roman.muzei" // target package's name
val intent = Intent().setClassName(packageName, activityName)
startActivity(intent)
Để mở nó bên ngoài ứng dụng hiện tại, hãy thêm cờ này trước khi bắt đầu ý định.
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
Một câu trả lời liên quan ở đây
private fun openOtherApp() {
val sendIntent = packageManager.getLaunchIntentForPackage("org.mab.dhyanaqrscanner")
startActivity(sendIntent)
finishAffinity()
}