Открытие файла APK из приложения для автоматизации c Обновление приложения - FileProvider Android - Firebase Storage - PullRequest
2 голосов
/ 18 июня 2020

Я пытаюсь проверить ведро 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>

Это внутреннее хранилище устройства, на котором я тестирую ... так что это своего рода то, из чего я собираюсь найти места для хранения. Кажется, файл загружается в правильное место. enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...