14 ответов:
вы можете легко запустить ссылку на рынок или запрос на установку:
Intent promptInstall = new Intent(Intent.ACTION_VIEW) .setDataAndType(Uri.parse("file:///path/to/your.apk"), "application/vnd.android.package-archive"); startActivity(promptInstall);Intent goToMarket = new Intent(Intent.ACTION_VIEW) .setData(Uri.parse("market://details?id=com.package.name")); startActivity(goToMarket);однако, вы не можете установить .АПК без пользователя разрешение; нет, если устройство и ваша программа не укоренены.
File file = new File(dir, "App.apk"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent);У меня была такая же проблема и после нескольких попыток, это сработало для меня этот путь. Я не знаю, почему, но установка данных и тип отдельно испортили мое намерение.
Ну, я копнул глубже, и нашел источники приложения PackageInstaller из источника Android.
https://github.com/android/platform_packages_apps_packageinstaller
из манифеста я обнаружил, что он требует разрешения:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />и сам процесс установки происходит после подтверждения
Intent newIntent = new Intent(); newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, mPkgInfo.applicationInfo); newIntent.setData(mPackageURI); newIntent.setClass(this, InstallAppProgress.class); String installerPackageName = getIntent().getStringExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME); if (installerPackageName != null) { newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName); } startActivity(newIntent);
все решения, представленные на этот вопрос, применимы к
targetSdkVersions из 23 и ниже. Для Android N, т. е. API уровня 24 и выше, однако, они не работают и сбой со следующим исключением:android.os.FileUriExposedException: file:///storage/emulated/0/... exposed beyond app through Intent.getData()это связано с тем, что начиная с Android 24, в
Uriдля адресации загруженный файл изменился. Например, установочный файл с именемappName.apkхранится в основной внешней файловой системе приложения с именем пакетаcom.example.testбудет как
file:///storage/emulated/0/Android/data/com.example.test/files/appName.apkна
API 23и ниже, тогда как что-то вродеcontent://com.example.test.authorityStr/pathName/Android/data/com.example.test/files/appName.apkна
API 24и выше.более подробную информацию об этом можно найти здесь и я не собираюсь проходить через это.
чтобы ответить на вопрос для
targetSdkVersionна24и выше, нужно выполнить следующие действия: Добавить в AndroidManifest.XML-код:<application android:allowBackup="true" android:label="@string/app_name"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.authorityStr" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/paths"/> </provider> </application>2. Добавить следующее к на
resв src, main:<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="pathName" path="pathValue"/> </paths>The
pathNameэто показано в примерном примере uri контента выше иpathValue- это фактический путь в системе. Было бы неплохо поставить "."(без кавычек) для pathValue в приведенном выше, если вы не хотите добавлять какой-либо дополнительный подкаталог.
напишите следующий код для установки apk с именем
appName.apkна главную внешних файловая система:File directory = context.getExternalFilesDir(null); File file = new File(directory, fileName); Uri fileUri = Uri.fromFile(file); if (Build.VERSION.SDK_INT >= 24) { fileUri = FileProvider.getUriForFile(context, context.getPackageName(), file); } Intent intent = new Intent(Intent.ACTION_VIEW, fileUri); intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); intent.setDataAndType(fileUri, "application/vnd.android" + ".package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(intent); activity.finish();разрешение также не требуется при записи в личный каталог вашего собственного приложения на внешней файловой системе.
я написал библиотеку AutoUpdate здесь в котором я использовал выше.
Я просто хочу поделиться тем фактом, что мой файл apk был сохранен в каталоге "данные" моего приложения и что мне нужно было изменить разрешения на файл apk, чтобы он был читаемым в мире, чтобы позволить ему быть установленным таким образом, иначе система бросала "ошибка разбора: есть проблема разбора пакета"; поэтому использование решения от @Horaceman, которое делает:
File file = new File(dir, "App.apk"); file.setReadable(true, false); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent);
выполните следующие действия:
1 - добавить
AndroidManifest.xml:<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/paths"/> </provider>2 - добавьте следующие пути.xml-файл в папку xml (если он не существует, создайте его) на res в src, main
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_file" path="."/> </paths>путь-это то, что показано в Примере URI примерного содержимого выше и pathValue является фактическим путем в системе. Было бы неплохо поставить "."для pathValue в приведенном выше, если вы не хотите добавлять какие-либо дополнительные подкаталог.
3 - напишите следующий код для запуска файлов Apk:
File file = "path of yor apk file"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Uri fileUri = FileProvider.getUriForFile(getBaseContext(), getApplicationContext().getPackageName() + ".provider", file); Intent intent = new Intent(Intent.ACTION_VIEW, fileUri); intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); intent.setDataAndType(fileUri, "application/vnd.android" + ".package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent); } else { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }и благодаря Али Немати Хаяти, чтобы быть первым, чтобы написать решение профиль Али-nemati-Хаяти
Да, это возможно. Но для этого вам нужен телефон для установки непроверенных источников. Например, приложений это. Я думаю, что лучшее, что вы можете сделать, это проверить, если приложение присутствует и отправить намерение для Android Market. вы должны использовать что-то схему url для android Market.
market://details?id=package.nameЯ не знаю точно, как начать деятельность, но если вы начинаете деятельность с такого рода url. Он должен открыть android market и дать вам выбор для установки приложения.
стоит отметить, что если вы используете
DownloadManagerчтобы начать загрузку, обязательно сохраните его на внешний носитель, например,setDestinationInExternalFilesDir(c, null, "<your name here>).apk";. Намерение с типом пакета-архива, похоже, не нравитсяcontent:схема используется с загрузками во внутреннее расположение, но нравитсяfile:. (Попытка обернуть внутренний путь в объект File, а затем получить путь также не работает, хотя это приводит кfile:url, так как приложение не будет анализировать apk; похоже, что это должно быть внешний.)пример:
int uriIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI); String downloadedPackageUriString = cursor.getString(uriIndex); File mFile = new File(Uri.parse(downloadedPackageUriString).getPath()); Intent promptInstall = new Intent(Intent.ACTION_VIEW) .setDataAndType(Uri.fromFile(mFile), "application/vnd.android.package-archive") .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); appContext.startActivity(promptInstall);
другое решение, которое не требует жесткого кода получающего приложения и поэтому более безопасно:
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); intent.setData( Uri.fromFile(new File(pathToApk)) ); startActivity(intent);
попробуй такое
String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); String title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() ); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error! MainActivity.this.startActivity(intent);
UpdateNode предоставляет API для Android для установки пакетов APK из другого приложения.
Вы можете просто определить свое обновление в интернете и интегрировать API в свое приложение - вот и все.
В настоящее время API находится в бета-состоянии, но вы уже можете сделать некоторые тесты самостоятельно.
Кроме того, UpdateNode предлагает также отображать сообщения, хотя система - довольно полезно, если вы хотите сказать что-то важное для ваших пользователей.
Я являюсь частью команда разработчиков клиента и я использую по крайней мере функциональность сообщений для моего собственного приложения для Android.
попробуйте это - Напишите на Манифесте:
uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions"написать код:
File sdCard = Environment.getExternalStorageDirectory(); String fileStr = sdCard.getAbsolutePath() + "/Download";// + "app-release.apk"; File file = new File(fileStr, "app-release.apk"); Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(promptInstall);
Сначала добавьте следующую строку в AndroidManifest.XML-код :
<uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" />затем используйте следующий код для установки apk:
File sdCard = Environment.getExternalStorageDirectory(); String fileStr = sdCard.getAbsolutePath() + "/MyApp";// + "app-release.apk"; File file = new File(fileStr, "TaghvimShamsi.apk"); Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(promptInstall);
Comments