Как скачать APK во внутреннем хранилище с URL, а затем автоматически установить в Android?
Это мой код
mUpdateNowView - это кнопка, и это метод onClick. Я автоматически загружаю и обновляю APK.
При установке apk я получил сообщение об ошибке Parse Error Произошла ошибка при разборе пакета.
Как я могу устранить эту ошибку
mUpdateNowView.setOnClickListener(updateNow);
public View.OnClickListener updateNow = new View.OnClickListener() {
public void onClick(View v) {
try {
ProgressDialog progress;
InstallAPK downloadAndInstall = new InstallAPK();
progress = new ProgressDialog(SplashActivity.this);
progress.setCancelable(false);
progress.setMessage("Downloading...");
downloadAndInstall.setContext(getApplicationContext(), progress);
downloadAndInstall.execute("http://APK_URL.apk");
} catch (Exception e) {
}
}
};
Это мой класс InstallAPK. Этот класс используется для загрузки apk во Внутреннее хранилище и автоматической установки apk.
public class InstallAPK extends AsyncTask<String, Void, Void> {
private ProgressDialog progressDialog;
private int status = 0;
private Context context;
public void setContext(Context context, ProgressDialog progress) {
this.context = context;
this.progressDialog = progress;
}
public void onPreExecute() {
progressDialog.show();
}
@Override
protected Void doInBackground(String... arg0) {
try {
URL url = new URL(arg0[0]);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
ContextWrapper cw = new ContextWrapper(context);
File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
File myDir = new File(directory, "Android/data/MyAPK");
myDir.mkdirs();
File outputFile = new File(myDir, "MyAPK.apk");
if (outputFile.exists()) {
outputFile.delete();
}
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is ;
int status = c.getResponseCode();
if (status != HttpURLConnection.HTTP_OK)
is = c.getErrorStream();
else
is = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
}
fos.flush();
fos.close();
is.close();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(directory, "Android/data/MyAPK/MyAPK.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} catch (FileNotFoundException fnfe) {
status = 1;
Log.e("File", "FileNotFoundException! " + fnfe);
} catch (Exception e) {
Log.e("UpdateAPP", "Exception " + e);
}
return null;
}
public void onPostExecute(Void unused) {
progressDialog.dismiss();
if (status == 1)
Toast.makeText(context, "MyAPK Not Available", Toast.LENGTH_LONG).show();
}
}
Пожалуйста, помогите мне. Заранее спасибо.
1 ответ
Вот возможные причины этой проблемы.
1. Could be renaming the apk file.
2. Could be that apk file downloaded but while installing you are not referring correct path in finder.
3. Could be that the file gets corrupted and there are other reasons as well.
В моем случае я запускаю приложение на устройствах, имеющих нугу и выше, это потому, что я выбрал файл apk, но перед использованием fileProvider; я забыл добавить XML-файл и изменения в файл манифеста Вот что я сделал.
Шаг 1: FileProvider - это специальный подкласс ContentProvider, который позволяет нам безопасно делиться файлом через URI содержимого: // вместо file: /// one.
<manifest>
...
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="@string/file_provider_authority"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
...
</application>
</manifest>
Шаг 2:
Здесь установите android: exported в false, потому что нам не нужно, чтобы он был общедоступным, android: grantUriPermissions в true, потому что он предоставит временный доступ к файлам и android: полномочия домену, который вы контролируете, поэтому, если ваш домен com.quiro. fileproviderexample, то вы можете использовать что-то вроде com.quiro.fileproviderexample.provider. Полномочия провайдера должны быть уникальными, и именно поэтому мы используем наш идентификатор приложения и что-то вроде.fileprovider:
<string name="file_provider_authority"
translatable="false">com.test.fileproviderexample.fileprovider</string>
Шаг3. Создайте файл file_provider_path в папке res / xml. Это файл, который определяет папки, которые содержат файлы, которые вы можете безопасно поделиться.
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files" path="." />
</paths>
Вместо использования Uri.fromFile (file) мы создаем наш URI с FileProvider.getUriForFile (context, string, file), который будет генерировать новый контент:// URI с определенными правами доступа, указывающими на файл, который мы передали. эта статья)
код:
Uri apkURI = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
File apkFile = new File(Environment.getExternalStorageDirectory() + "/apks/test.apk");
apkURI = FileProvider.getUriForFile(mContext,
BuildConfig.APPLICATION_ID + ".provider",
apkFile);
}
else
{
apkUri = Uri.Fromfile(apkFile);
}
Intent intent = new Intent(Intent.VIEW);
intent.setData(apkURI);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
mContext.startActivity(intent);