14

PackageInstaller (https://developer.android.com/reference/android/content/pm/PackageInstaller.html) dường như đã được thêm vào bắt đầu từ API 21 (Lollipop), tuy nhiên tôi chưa tìm thấy bất kỳ ví dụ mã rắn nào về cách cài đặt APK thông qua API này. Mọi mã trợ giúp sẽ được đánh giá caoPackageInstaller "Android M Preview

Tôi đang điều tra các ứng dụng COSU/Kiosk cho Android M Preview và đang cố gắng triển khai tính năng mới "Cài đặt và gỡ cài đặt ứng dụng im lặng của Chủ sở hữu thiết bị" (https://developer.android.com/preview/api-overview.html#afw) thông qua API PackageInstaller.

Tìm thấy này, nhưng không hữu ích: How to install/update/remove APK using "PackageInstaller" class in Android L? What's "PackageInstaller" class on Lollipop, and how to use it?

Không tìm thấy bất kỳ mẫu ứng dụng Android hoặc.

Xin cảm ơn trước.

+0

bản sao có thể có của [Cách cài đặt/cập nhật/xóa APK bằng cách sử dụng lớp "PackageInstaller" trong Android L?] (Http://stackoverflow.com/questions/26884956/how-to-install-update-remove-apk- using-packageinstaller-class-in-android-l) – Kenneth

+0

Như @Kenneth đề cập, có vẻ như [answer] (http://stackoverflow.com/a/27520814/2050) cung cấp mã mẫu tìm kiếm. –

Trả lời

2

đặn nó ra, đây là các mã:

try 
    { 
     PackageInstaller pi = app.getPackageManager().getPackageInstaller(); 
     int sessId   = pi.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)); 

     PackageInstaller.Session session = pi.openSession(sessId); 

     // .. write updated APK file to out 


     long sizeBytes = 0; 
     final File file = new File(filepathApk); 
     if (file.isFile()) 
     { 
      sizeBytes = file.length(); 
     } 

     InputStream in = null; 
     OutputStream out = null; 

     in = new FileInputStream(filepathApk); 
     out = session.openWrite("my_app_session", 0, sizeBytes); 

     int total = 0; 
     byte[] buffer = new byte[65536]; 
     int c; 
     while ((c = in.read(buffer)) != -1) 
     { 
      total += c; 
      out.write(buffer, 0, c); 
     } 
     session.fsync(out); 
     in.close(); 
     out.close(); 

     System.out.println("InstallApkViaPackageInstaller - Success: streamed apk " + total + " bytes"); 

     // fake intent 
     Context app = this; 
     Intent intent = new Intent(app, AlarmReceiver.class); 
     PendingIntent alarmtest = PendingIntent.getBroadcast(app, 
       1337111117, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     session.commit(alarmtest.getIntentSender()); 
     session.close(); 

    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
+0

Lớp 'AlarmReceiver' làm gì? –

4

Điều này có thể từ Android 6.0 trở lên.

  • Đặt ứng dụng của bạn làm Chủ sở hữu thiết bị.

Sau khi ứng dụng của bạn nhận được quyền của chủ sở hữu Thiết bị, chúng tôi có thể cài đặt, gỡ cài đặt và cập nhật âm thầm mà không cần bất kỳ sự can thiệp nào của người dùng.

public static boolean installPackage(Context context, InputStream in, String packageName) 
     throws IOException { 
    PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); 
    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
      PackageInstaller.SessionParams.MODE_FULL_INSTALL); 
    params.setAppPackageName(packageName); 
    // set params 
    int sessionId = packageInstaller.createSession(params); 
    PackageInstaller.Session session = packageInstaller.openSession(sessionId); 
    OutputStream out = session.openWrite("COSU", 0, -1); 
    byte[] buffer = new byte[65536]; 
    int c; 
    while ((c = in.read(buffer)) != -1) { 
     out.write(buffer, 0, c); 
    } 
    session.fsync(out); 
    in.close(); 
    out.close(); 

    session.commit(createIntentSender(context, sessionId)); 
    return true; 
} 


private static IntentSender createIntentSender(Context context, int sessionId) { 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(
       context, 
       sessionId, 
       new Intent(ACTION_INSTALL_COMPLETE), 
       0); 
     return pendingIntent.getIntentSender(); 
    } 

Uninstall:

String appPackage = "com.your.app.package"; 
Intent intent = new Intent(getActivity(), getActivity().getClass()); 
PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0); 
PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller(); 
mPackageInstaller.uninstall(appPackage, sender.getIntentSender()); 

Hoàn thành chủ sở hữu thiết bị ứng dụng demo trong repo này.

+0

createIntentSender ở đây là gì ..? –

+0

@sandeep kiểm tra câu trả lời được cập nhật – amalBit

+0

ACTION_INSTALL_COMPLETE cũng không được xác định! là chuỗi tĩnh ACTION_INSTALL_COMPLETE = 'someString' hoặc hằng số android cụ thể? – prototyp

Các vấn đề liên quan