Проблема с тем, что вы делаете, заключается в том, что для получения разрешения INSTALL_PACKAGES
ваше приложение должно находиться в папке / system / priv-app.Если ваше приложение не находится в этой папке, то вам не будет предоставлено разрешение, и ваше приложение не сможет работать.
Другой способ программной установки приложения без подсказок при условии, что у вас есть root-доступ, будет выглядеть следующим образом:
Сначала вы должны добавить это разрешение в свой манифест Android.<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
Студия Android может жаловаться, что это системное разрешение и оно не будет предоставлено.Не беспокойтесь, поскольку ваше приложение будет установлено в папку / system / priv-app, оно получит только разрешение для этой системы.
После добавления разрешения вы можете использовать следующий статический метод для установки пакетов.,Все, что вам нужно сделать, это предоставить URL-адрес в виде String
, который можно использовать для доступа к файлу, и Context
, и приложение будет установлено.
public static boolean installPackage(final Context context, final String url)
throws IOException {
//Use an async task to run the install package method
AsyncTask<Void,Void,Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
try {
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
// set params
int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
OutputStream out = session.openWrite("COSU", 0, -1);
//get the input stream from the url
HttpsURLConnection apkConn = (HttpsURLConnection) new URL(url).openConnection();
InputStream in = apkConn.getInputStream();
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();
//you can replace this intent with whatever intent you want to be run when the applicaiton is finished installing
//I assume you have an activity called InstallComplete
Intent intent = new Intent(context, InstallComplete.class);
intent.putExtra("info", "somedata"); // for extra data if needed..
Random generator = new Random();
PendingIntent i = PendingIntent.getActivity(context, generator.nextInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
session.commit(i.getIntentSender());
} catch (Exception ex){
Log.e("AppStore","Error when installing application. Error is " + ex.getMessage());
}
return null;
}
};
task.execute(null,null);
return true;
}
Примечание. В случае сбоя установкидаже если приложение установщика находится в system / priv-app, убедитесь, что вы подписали приложение ключом разблокировки.Иногда подписывание с помощью ключа отладки препятствует предоставлению разрешения Install_Packages