2010-12-12 26 views

Trả lời

8

Trong Android 2.3, bạn có thể sử dụng startActivity() trên ACTION_APPLICATION_DETAILS_SETTINGSIntent, với cách thích hợp Uri, để hiển thị màn hình "quản lý" của ứng dụng. Tuy nhiên, điều này là mới đối với Android 2.3 - Tôi không biết cách thực hiện điều đó trong các phiên bản trước của Android.

6
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_SETTINGS)); 

sẽ đưa bạn đến danh sách cài đặt/ứng dụng. Nếu bạn muốn mở một ứng dụng cụ thể, tôi nghĩ rằng trong 2.2 và dưới đây không có cách nào, vì vậy bạn sẽ cần phải đi một (không nhất thiết phải đề nghị, vì vô hiệu) cách:

final Intent i = new Intent("android.intent.action.VIEW");     
i.setComponent(new ComponentName("com.android.settings","com.android.settings.InstalledAppDetails")); 
i.putExtra(...); // need to figure out the correct extra, probably app package name 
startActivity(i); 

Nhưng lưu ý rằng đây là không được khuyến nghị vì nó không phải là API/ý định chính thức (bộ lọc) và do đó có thể thay đổi trong tương lai.

+0

Tôi sẽ không đề xuất sau. Điều gì sẽ xảy ra nếu ứng dụng độc hại sử dụng gói: com.android.settings? –

+0

@PaoloRovelli Tôi đã viết "không nhất thiết được đề xuất", nhưng vì một lý do khác. Tôi không nghĩ rằng bạn có thể tránh được sự nguy hiểm mà bạn đề cập đến; nếu hai ứng dụng sử dụng cùng một ý định (chuỗi), thì người dùng sẽ luôn nhận được một hộp thoại để chọn ứng dụng để sử dụng (làm giảm nguy cơ một chút). Nhưng cũng lưu ý rằng tham số trong phương pháp tiếp cận đầu tiên cũng không có gì ngoài một chuỗi: http://developer.android.com/reference/android/provider/Settings.html#ACTION_APPLICATION_SETTINGS - vì vậy không có sự bảo vệ nào khỏi ứng dụng độc hại nếu nó sử dụng tên gói com.android.settings. –

76

Trong phiên bản 2.2 trở xuống, không có API công khai mà bạn có thể truy cập. Nhưng bạn vẫn có thể bắt đầu hoạt động InstalledAppDetails cũng giống như ManageApplications. thấy here

// utility method used to start sub activity 
private void startApplicationDetailsActivity() { 
    // Create intent to start new activity 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setClass(this, InstalledAppDetails.class); 
    intent.putExtra(APP_PKG_NAME, mCurrentPkgName); 
    // start new activity to display extended information 
    startActivityForResult(intent, INSTALLED_APP_DETAILS); 
} 

Kết luận: bạn có thể bắt đầu "Thông tin ứng dụng" màn hình như thế này tôi đã viết:

private static final String SCHEME = "package"; 

private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName"; 

private static final String APP_PKG_NAME_22 = "pkg"; 

private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings"; 

private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails"; 

public static void showInstalledAppDetails(Context context, String packageName) { 
    Intent intent = new Intent(); 
    final int apiLevel = Build.VERSION.SDK_INT; 
    if (apiLevel >= 9) { // above 2.3 
     intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
     Uri uri = Uri.fromParts(SCHEME, packageName, null); 
     intent.setData(uri); 
    } else { // below 2.3 
     final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22 
       : APP_PKG_NAME_21); 
     intent.setAction(Intent.ACTION_VIEW); 
     intent.setClassName(APP_DETAILS_PACKAGE_NAME, 
       APP_DETAILS_CLASS_NAME); 
     intent.putExtra(appPkgName, packageName); 
    } 
    context.startActivity(intent); 
} 
+0

cảm ơn bạn rất nhiều! điều này đã cứu tôi rất nhiều thời gian. nên bình luận "ở trên 2.3" được thay đổi thành "2.3 trở lên"? – kristianlm

+0

hoạt động hoàn hảo cho mọi ứng dụng đã cài đặt. Tuy nhiên, nếu tôi cố gắng mở cài đặt của bất kỳ ứng dụng hệ thống nào, màn hình trống sẽ xuất hiện. –

+1

Ngoài ra chúng ta cần thêm intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); trong cả hai câu lệnh. tức là nếu() {... ở đây ...} người khác {... ở đây ...} –

52

Từ API Level 9 (Android 2.3), bạn có thể bắt đầu một Intent với android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS. Như vậy:

packageName = "your.package.name.here" 

try { 
    //Open the specific App Info page: 
    Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
    intent.setData(Uri.parse("package:" + packageName)); 
    startActivity(intent); 

} catch (ActivityNotFoundException e) { 
    //e.printStackTrace(); 

    //Open the generic Apps page: 
    Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); 
    startActivity(intent); 

} 
14

Cũ câu hỏi, cải thiện câu trả lời:

/** 
* <p>Intent to show an applications details page in (Settings) com.android.settings</p> 
* 
* @param context  The context associated to the application 
* @param packageName The package name of the application 
* @return the intent to open the application info screen. 
*/ 
public static Intent newAppDetailsIntent(Context context, String packageName) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
     Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.setData(Uri.parse("package:" + packageName)); 
     return intent; 
    } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.FROYO) { 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.setClassName("com.android.settings", 
       "com.android.settings.InstalledAppDetails"); 
     intent.putExtra("pkg", packageName); 
     return intent; 
    } 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setClassName("com.android.settings", 
      "com.android.settings.InstalledAppDetails"); 
    intent.putExtra("com.android.settings.ApplicationPkgName", packageName); 
    return intent; 
} 
9

tôi đã sử dụng Paolo giải pháp để mở chi tiết Cài đặt ứng dụng trong SDK 23+ khi người dùng đã từ chối yêu cầu sự cho phép trong quá khứ và chọn tùy chọn "Không hỏi lại" trong hộp thoại hệ thống yêu cầu quyền.

Nhưng trong trường hợp này, tôi đã sử dụng phương thức getPackageName() trực tiếp.

Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
intent.setData(Uri.parse("package:" + getPackageName())); 
startActivity(intent); 
Các vấn đề liên quan