Не могу установить apk из папки активов - PullRequest
0 голосов
/ 16 мая 2018

В моей папке с активами у меня есть один файл apk. Моя цель - установить apk одним нажатием кнопки. Я написал функцию, которая может читать apk и генерировать файл, но не может его установить. Вот моя функция

private File prepareApk(String assetName) {
    byte[] buffer = new byte[8192];
    InputStream is = null;
    FileOutputStream fout = null;
    try {
        is = getAssets().open(assetName);
        fout = openFileOutput("tmp.apk", Context.MODE_PRIVATE);
        int n;
        while ((n=is.read(buffer)) >= 0) {
            fout.write(buffer, 0, n);
        }
    } catch (IOException e) {
        Log.i("InstallApk", "Failed transferring", e);
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if (fout != null) {
                fout.close();
            }
        } catch (IOException e) {
        }
    }

    return getFileStreamPath("tmp.apk");
}

Я называю эту функцию вот так

 Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
 intent.setData(Uri.fromFile(prepareApk("myapk.apk")));
 startActivity(intent);

Без исключений, без предупреждений, просто не могу его установить. Вот мой источник файла gradle

android {
compileSdkVersion 27
defaultConfig {
    applicationId "com.mypackage.music"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
   'proguard-rules.pro'
     }
   }
}

 dependencies {
 implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'

} Как я могу решить мою проблему? спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Другие приложения, включая установщик, не имеют доступа к внутренней части вашего приложения.Кроме того, в Android 7.0+ вы получите сбой FileUriExposedException.

. В Android 7.0+ вам потребуется использовать FileProvider для обслуживания файла, используя FileProvider.getUriForFile() для Uri.чтобы вставить Intent.

На Android 6.0 и более ранних версиях вам придется сохранить файл на внешнем хранилище (например, getExternalCacheDir()).

...