Anroid 8.0 permite que os aplicativos para baixar e instalar fonte desconhecida de completo lógica & Adapter processamento de acesso 7.0 arquivo

  Durante o processo de atualização em questão 8.0 Baixar encontrado, o download está completo pacote de instalação não atualiza após a página de salto
  que a permissão para instalar aplicativos desconhecidos no Android 8.0 é o interruptor estiver desligado por padrão, exigindo que o usuário manualmente ligar o Permitir
aplicativo de origem desconhecida [ autoridade] para ser capaz de instalar. Para segurança Google Android pode ser descrito como mais e mais rigoroso.

Veja como lidar com

1, o aumento pedido permissão para instalar no arquivo de manifesto

<uses-permissionandroid:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

2, principalmente através deste método para determinar se deve obter permissão para instalar

 haveInstallPermission = getPackageManager().canRequestPackageInstalls();

Se haveInstallPermission verdade, o aplicativo obteve permissão para instalar aplicativos de fontes desconhecidas, você pode executar a lógica apropriada instalar aplicativos diretamente.

Se false haveInstallPermission, a aplicação não obter permissão para instalar aplicativos de fontes desconhecidas, você não pode instalar o aplicativo. Uma vez que este não é permissão para instalar as permissões de tempo de execução, para que o código não podem mais solicitar permissão, jogando apenas um diálogo de aviso, informar os usuários precisam instalar autoridade, confirmou o salto para definir a interface de permissões abertas.

3, não obteve permissão, você precisa ir manualmente para "Configurações de página correspondente à aplicação." Isso permite que página de configurações de instalação permite ao usuário verificar manualmente

    // 注意这个是8.0新API需要判断
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Uri packageURI = Uri.parse("package:" + Context.getPackageName());
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
            startActivityForResult(intent, REQUEST_CODE_INSTALL_PERMISSION);
        }

De acordo com o nome do pacote para entrar na página de configurações desta aplicação, não vai passar, em seguida, entrará em uma lista de todas as configurações
(dicas: valor resultCode == RESULT_OK retornará false se o onActivityResult voltou depois de entrar na lista é definida)

lógica completa:

 private static final int REQUEST_CODE_INSTALL_PERMISSION = 107;
  /**
     * 安装应用的流程  大于8.0需要用户手动打开未知来源安装权限
     * 需要在清单文件中加入权限  REQUEST_INSTALL_PACKAGES
     */
    private void installProcess() {

        boolean haveInstallPermission;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            haveInstallPermission = getPackageManager().canRequestPackageInstalls();
            if (!haveInstallPermission) {
                //没有未知来源安装权限权限
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("提示");
                builder.setMessage("安装应用需要打开未知来源权限,请去设置中开启应用权限,以允许安装来自此来源的应用");
                builder.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                            startInstallPermissionSettingActivity();
                        }
                    }
                });
                builder.show();
                return;//防止系统执行默认的方法会跳转页面后弹窗提示,所以会重复 return 掉
            }
        }

        installApk();
    }

   /**
     * 有权限,开始安装应用程序
     */
    private void installApk() {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(Intent.ACTION_VIEW);
                          /*  intent.setDataAndType(Uri.fromFile(new File(getDownloadTempFileName())),
                            "application/vnd.android.package-archive");*/
        //适配Android 7.0 FileProvider文件访问,这里可能需要你修改成自己的访问方式
        FileProvider7.setIntentDataAndType(CompulsiveHelperActivity.this,
                intent, "application/vnd.android.package-archive", new File(getDownloadTempFileName()), true);
        startActivity(intent);
    }

  @RequiresApi(api = Build.VERSION_CODES.O)
    private void startInstallPermissionSettingActivity() {
        //注意这个是8.0新API
        Uri packageURI = Uri.parse("package:" + getPackageName());
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
        startActivityForResult(intent, REQUEST_CODE_INSTALL_PERMISSION);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_INSTALL_PERMISSION) {
            installProcess();//再次执行安装流程,包含权限判等
        }
    }

dicas

(1), antes de baixar o aplicativo, você deve cumprir com as permissões de acesso para ler e escrever privilégios para executar 6.0
(2), exigem a adaptação processo de necessidade de acesso 7.0 arquivo para obter através FileProvider. Aqui eu uso as ferramentas de uma abordagem Hongyang fornecido FitAndroid7

Sobre Android mudança 7.0 de comportamento através de compartilhamento de arquivos FileProvider entre aplicações bar

Publicado 26 artigos originais · ganhou elogios 19 · vê 40000 +

Acho que você gosta

Origin blog.csdn.net/a23006239/article/details/79574031
Recomendado
Clasificación