Я пытаюсь проверить ведро FirebaseStorage на наличие нового файла APK, если есть новая версия, загрузите ее, а затем откройте файл, чтобы автоматически начать установку. Скачать файл легко, но я не могу заставить FileProvider работать для открытия файла? Я загружаю файл во внешнее хранилище, в частности, в папку «Загрузки» пользователя. Я пытаюсь открыть его, используя намерение, и хотя никаких ошибок не возникает, ничего не открывается и определенно не происходит обновления.
Вот функция обновления. Вы, вероятно, можете игнорировать большую часть этого до самой середины, когда я пытаюсь открыть файл, остальное просто загружается из Firebase и работает нормально.
public void checkForAppUpdate() {
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
Network activeNetwork = cm.getActiveNetwork();
boolean isConnected = activeNetwork != null;
if (isConnected) {
StorageReference reference = firebaseStorage.getReference().getRoot().child("Apk-Release");
File rootpathtemp = new File(Environment.getExternalStorageDirectory().getParent(),"");
final File rootpath = new File(rootpathtemp.getParent(),"/self/primary/Download/");
if(!rootpath.exists()){
rootpath.mkdirs();
}
System.out.println(settings.this.getExternalFilesDir(null));
reference.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
@Override
public void onSuccess(ListResult listResult) {
for(final StorageReference item : listResult.getItems()){
if(Integer.parseInt(item.getName().replace("_","").replace("ver","").replace(".apk","")) > BuildConfig.VERSION_CODE){
final File localfile = new File(rootpath,item.getName());
item.getFile(localfile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
System.out.println(localfile.getAbsolutePath());
System.out.println(rootpath.getAbsolutePath());
Uri data = getUriForFile(settings.this, settings.this.getApplicationContext().getPackageName() + ".provider",localfile);
i.setDataAndType(data,"application/vnd.android.package-archive");
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
settings.this.getApplicationContext().startActivity(i);
}
});
break;
}
}
}
});
}
}
Я добавил поставщика в манифест ...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapp.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
Я включил документ provider_paths xml в / res / xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external_files"
path="./../../self/primary/Download"
/>
</paths>
Это внутреннее хранилище устройства, на котором я тестирую ... так что это своего рода то, из чего я собираюсь найти места для хранения. Кажется, файл загружается в правильное место.