Установите apk из другой программы

Я пытаюсь создать приложение, которое автоматически загружает apk с определенного сервера и устанавливает его в систему. Мой код для установки выглядит следующим образом, но не работает.

File f = new File("/mnt/sdcard/download/", "Demo.apk"); Log.i("Demo", "f "+f.getAbsoluteFile()); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package_archive"); intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); m_context.startActivity(intent); 

Мне нужно предоставить какие-либо права в Manifest.xml для установки? Я знаю, что этот вопрос задавали раньше, но ни один из ответов не помог мне до сих пор.

Это то, что я делаю в моем случае,

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(path+"/<application_name>.apk")), "application/vnd.android.package-archive"); startActivity(intent); 

И это разрешения.

 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Спасибо за помощь, заставило ее работать наконец. Я разделяю свой рабочий код и рабочий Manifest.xml.

 package test.installer; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; public class InstallToolActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("Demo", "onCreate"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://"+"/mnt/sdcard/HelloWorld.apk"), "application/vnd.android.package-archive"); intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } } 

Manifext.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.installer" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INSTALL_PACKAGES"/> <uses-permission android:name="android.permission.RESTART_PACKAGES"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".InstallToolActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

// Фредрик

Я тоже делаю

 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

И моя установка выглядит так

 intent.setDataAndType(Uri.parse("file://"+path), "application/vnd.android.package-archive"); 

Мой path – это String, как и ваш f

Вам нужно сделать это

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); 

В вашем коде вы упомянули «package_archive», это должен быть «пакет-архив».
Вам понадобятся следующие разрешения.

 <uses-permission android:name="android.permission.INSTALL_PACKAGES"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

Если ваш targetSdkVersion равен или больше 24, вам необходимо использовать реализацию FileProvider для Android N и более поздних версий Android.

Вот и вся реализация:

 // utility method private void openAppInstaller(Context context, File toInstall) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Uri apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", toInstall); Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); intent.setData(apkUri); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(intent) } else { Uri apkUri = Uri.fromFile(toInstall); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } 

Добавить поставщика FileProvider в AndroidManifest

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> 

И создайте provider_paths.xml в ресурсах xml.

 <?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external_files" path="."/> </paths> 

Подробнее о конфигурации FileProvider вы можете прочитать здесь и здесь .

Все кредиты идут на @just_user, потому что мой ответ основывается на его ответе .