启动APK Installer Oreo

时间:2017-11-16 19:15:03

标签: android android-8.0-oreo

我已经让这段代码工作了一段时间,但是使用Android Orea它不起作用。

        Context context = mContextRef.get();

        if (context == null) {
            return;
        }

        // Get the update
        String filepath = getDownloadLocation();
        File apkFile = new File(filepath);

        Uri fileLoc;
        Intent intent;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
            fileLoc = android.support.v4.content.FileProvider.getUriForFile(context, mFileProviderAuthority, apkFile);
        } else {
            intent = new Intent(Intent.ACTION_VIEW);
            fileLoc = Uri.fromFile(apkFile);
        }

        intent.setDataAndType(fileLoc, "application/vnd.android.package-archive");
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

        context.startActivity(intent);

此代码适用于除8.0及以上版本的所有Android版本。

修改

很抱歉没有解释更多。它没有工作意义,它闪烁了一小段时间的窗口并消失(有些时候不知不觉)并继续在旧应用程序中。该文件已成功下载(我可以导航到它并安装),但是当我尝试以编程方式启动活动时,它会失败并且没有任何错误或日志。

2 个答案:

答案 0 :(得分:5)

显然,如果你的应用程序针对更高版本的android,则清单中需要android.permission.REQUEST_INSTALL_PACKAGES权限,否则会发生任何事情,除非LogCat中出现单行错误。

请在manifest.xml文件中包含以下内容:

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

Manifest API for REQUEST_INSTALL_PACKAGES

答案 1 :(得分:0)

请首先在Manifest.xml中添加<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>权限。

如果SDK版本等于或大于26,我们应该检查getPackageManager().canRequestPackageInstalls()的结果。

代码如下:

private void checkIsAndroidO() {  
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {  
    boolean result = getPackageManager().canRequestPackageInstalls();  
    if (result) {  
      installApk();
    } else {  
      // request the permission 
      ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);  
    }  
  } else {
    installApk();  
  }  
}

@Override  
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);

  switch (requestCode) {  
    case INSTALL_PACKAGES_REQUESTCODE:  
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {  
        installApk();  
      } else {  
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);  
        startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);  
      }  
    break;  
  }  
}

@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  super.onActivityResult(requestCode, resultCode, data); 

  switch (requestCode) {  
    case GET_UNKNOWN_APP_SOURCES:  
      checkIsAndroidO();  
      break;  

    default:  
      break;  
  }  
}

希望它能对您有所帮助。