当前位置: 首页 > 知识库问答 >
问题:

在android O中自动下载和安装apk

严扬
2023-03-14
File file, folder;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Utility.checkPermissionCamera(Main2Activity.this);
    Utility.checkPermissionInstall(Main2Activity.this);
        String fileName = "AutoDownloadApplication.apk";
        folder = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString());
        Logger.e("FOLDER", " " + folder);
        file = new File(folder.getAbsolutePath(), fileName);
        Log.e("File ", "" + file);

        final Uri uri = FileProvider.getUriForFile(Main2Activity.this, BuildConfig.APPLICATION_ID + ".provider", file);
        Logger.e("Check URI ", "" + uri);
    if (Utility.checkPermissionCamera(Main2Activity.this)) {
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(StaticConstant.DOWNLOADAPK));
        request.setDescription("Downloading New Apk");
        request.setTitle(Main2Activity.this.getString(R.string.app_name));
        //set destination
        request.setDestinationInExternalFilesDir(Main2Activity.this, BuildConfig.APPLICATION_ID + ".provider", fileName);

        // get download service and enqueue file

            final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
            final long downloadId = manager.enqueue(request);
            //set BroadcastReceiver to install app when .apk is downloaded
            BroadcastReceiver onComplete = new BroadcastReceiver() {
                public void onReceive(Context ctxt, Intent intent) {

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
                    intent.setData(uri);
                    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    startActivity(intent);
                } else {
                    Intent install = new Intent(Intent.ACTION_VIEW);
                    install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    install.setDataAndType(uri,
                            manager.getMimeTypeForDownloadedFile(downloadId));
                    startActivity(install);
                }
                    unregisterReceiver(this);
                }
            };
            //register receiver for when .apk download is compete
            registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        }
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="MyPackageName">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<permission
    android:name="android.permission.REQUEST_INSTALL_PACKAGES"
    android:protectionLevel="normal" />

<uses-permission
    android:name="android.permission.REQUEST_DELETE_PACKAGES"
    tools:ignore="ProtectedPermissions" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="MyPackageName.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

</application>

下面是file_paths XML:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="Download" path="Android/data/MyPackageName/files/Download"/>
</paths>

共有1个答案

倪举
2023-03-14

请首先在manifest.xml中添加 权限。

如果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;  
  }  
}
 类似资料:
  • 关于如何在Linux上自动下载Java JDK,有一个很好的答案:通过wget在Linux上下载Java JDK,显示的是许可页面 在我的浏览器中尝试这一操作时,我看到下载链接在查询参数中添加了一个额外的身份验证: 使用AuthParam将此链接复制并粘贴到调用中也不起作用。我的初步猜测是它与会话或IP地址绑定在一起。 尝试手动下载到服务器(或者一天下载到一百个服务器上一百次)是不合理的,所以我希

  • 每个步骤可以以不同的方式完成,具体取决于你的平台和要使用的 Scapy 版本。 目前,Scapy 有两个不同版本: Scapy v1.x。它只包含一个文件,并适用于 Python 2.4,因此它可能更易于安装。 此外,你的操作系统可能已经含有一个为之特别准备的包或端口。 最后一个版本是 v1.2.2。 Scapy v2.x。当前的开发版本增加了多个功能(例如 IPv6)。 它包括以distutil

  • 主要内容:使用pip理器安装,使用Anaconda安装,验证安装Matplotlib 是 Python 的第三方绘图库,它非常类似于 MATLAB。在使用 Matplotlib 软件包之前,需要对其进行安装。本节以 Windows10 系统为例,介绍 Matplotlib 的几种安装方式。 MATLAB 是一款商业软件,主要用于数据分析、图像处理、计算机视觉等领域。 使用pip理器安装 使用 Python 包管理器 pip 来安装 Matplotlib 是一种

  • 主要内容:Selenium下载安装,安装浏览器驱动,自动访问百度Selenium 是一个用于测试 Web 应用程序的自动化测试工具,它直接运行在浏览器中,实现了对浏览器的自动化操作,它支持所有主流的浏览器,包括 IE,Firefox,Safari,Chrome 等。 Selenium 支持所有主流平台(如,Windows、Linux、IOS、Android、Edge、Opera等),同时,它也实现了诸多自动化功能,比如软件自动化测试,检测软件与浏览器兼容性,自

  • 主要内容:Tomcat 下载和安装Servlet 是基于 Java 的动态网站开发技术,它的所有类和组件都是基于 Java 实现的,要想使用 Servlet,就必须提前配置好 Java 运行环境。相信各位读者都已经掌握了如何搭建 Java 环境,此处就不再赘述了,不了解的读者请转到: Java JDK下载与安装教程 Java JDK环境变量配置 搭建好了 Java 环境,再安装一款 Web 容器就可以运行 Servlet 代码了。

  • 主要内容:Goland 简介,Goland 下载和安装,运行 Goland 并激活,Goland 汉化工欲善其事必先利其器,命令行工具虽然能够满足我们一些基本操作的需求,但实际工作中怎么能没有一款趁手的开发工具呢? 学习Go语言同样如此,一个强大的集成开发环境(IDE)能够大大提高我们的开发效率,目前市面上比较流行的有下面这几种: GoLand:由 JetBrains 公司开发的一个新的商业 IDE; LiteIDE X:一款简单、开源、跨平台的Go语言 IDE; 第三方插件:Sublime T