6

Tôi có tính năng được triển khai: cài đặt gói ứng dụng theo chương trình. Mã tôi đang sử dụng:PackageInstallerActivity không tìm thấy trên bản xem trước dành cho nhà phát triển Android M

ComponentName comp = new ComponentName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
Intent newIntent = new Intent(callingIntent); 
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
newIntent.setComponent(comp); 

CallIntent chứa apk từ một dịch vụ khác.

Trên Android 6.0 (MPA44G, Nexus 5), mục đích này bị lỗi. Logcat:

08-20 14:58:56.127 26222 26222 E AndroidRuntime: Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity}; have you declared this activity in your AndroidManifest.xml? 

Trên các thiết bị Lollipop, mã trên hoạt động tốt.

Google đã xóa hoàn toàn PackageInstallerActivity chưa? Có cách nào khác để cài đặt một gói ứng dụng cụ thể trên Android 6.0 theo chương trình không?

Tham chiếu: Issue 3017: Unable to find explicit activity class com.android.packageinstaller.PackageInstallerActivity

Trả lời

2

Tôi nhận được câu trả lời. Intent.ACTION_INSTALL_PACKAGE là một lựa chọn tốt hơn. Nếu ứng dụng của bạn được đăng ký như một trình cài đặt gói, sử dụng mẫu mã dưới đây để bỏ qua hộp thoại tính năng chọn:

intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); 
intent.setData(Uri.fromFile(file)); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Nếu bạn muốn sử dụng trình cài đặt gói tiêu chuẩn, sử dụng đoạn mã sau:

File apkFile = new File(apkFileString); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); 
mContext.startActivity(intent); 
+2

Tôi đang sử dụng Nexus 5 với Android M và giải pháp của bạn là đem lại cho tôi: 'ActivityNotFoundException' – pkuszewski

2

Khi bạn nhận thấy đường dẫn gói không chính xác và không chỉ định nó sẽ thoát khỏi sự cố. Hiện tại, chúng tôi có

API <= 22 com.android.packageinstaller 

API >= 23 com.google.android.packageinstaller 

Bạn có thể tìm thấy bất kỳ đường dẫn ứng dụng hệ thống nào trên thiết bị có adb. Ví dụ về việc tôi tìm trình cài đặt gói mới trên Nexus 5X trông như thế này.

$ adb shell 'pm list packages -f install' 

package:/data/app/android.autoinstalls.config.google.nexus-1/base.apk=android.autoinstalls.config.google.nexus 
package:/system/app/CertInstaller/CertInstaller.apk=com.android.certinstaller 
package:/system/priv-app/GooglePackageInstaller/GooglePackageInstaller.apk=com.google.android.packageinstaller 
+0

Nexus 5X chạy android phiên bản 6.0.1 (api 23): com.google.android.packageinstaller. Nexus 5 chạy Android 6.0.1 (api 23): com.android.packageinstaller. Kiểm tra mức độ API KHÔNG phải là một phương pháp được bảo đảm để xác định rằng tên gói –

+0

@Bryan Johnson là bạn thực sự phải không? bạn đã đăng 2 phiên bản bằng nhau với 2 kết quả khác nhau? Bạn có chắc chắn nó không phải là một phiên bản xem trước trên một trong số họ? Điều này vẫn còn thực tế? – David

+0

@David Có các thiết bị ngoài đó có đường dẫn "sai". Tôi muốn thêm fallbacks cho cả hai. Thử lại với đường dẫn khác. –

0

Ngoài @ Adam Wigren câu trả lời:
Trong Android 6 tên GÓI đã thay đổi nhưng không phải là hoạt động

ComponentName comp; 
if(android.os.Build.VERSION.SDK_INT < 23){ 
    comp = new ComponentName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
}else{ 
    comp = new ComponentName("com.google.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
} 

Intent newIntent = new Intent(callingIntent); 
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
newIntent.setComponent(comp); 
0

Bạn có thể tập tin apk chỉ cần mở trong android6.0. see demo code

0

Để tránh: ActivityNotFoundException sử dụng Intent.ACTION_INSTALL_PACKAGE

ComponentName comp; 
File apkFile = new File(apkFileString); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); 

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1/*23*/){ 
comp = new ComponentName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
}else{ 
comp = new ComponentName("com.google.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); 
} 

intent.setComponent(comp); 
startActivity(intent); 
Các vấn đề liên quan