如何设置可通过普通链接/Google Drive链接下载APK的下载按钮?
Android 设置APK下载按钮(普通链接/Google Drive链接)
一、通过普通直接APK链接实现下载按钮
1. 布局文件(activity_version.xml)
添加下载按钮:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn_download_apk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下载APK" /> </LinearLayout>
2. 代码实现(VersionActivity.java)
使用系统DownloadManager服务处理下载,支持断点续传、系统通知栏进度显示:
package com.example.project; import android.app.DownloadManager; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class VersionActivity extends AppCompatActivity { private Button btnDownloadApk; // 替换为你的APK直接下载链接 private static final String APK_DOWNLOAD_URL = "https://example.com/your-app.apk"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_version); btnDownloadApk = findViewById(R.id.btn_download_apk); btnDownloadApk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startApkDownload(APK_DOWNLOAD_URL); } }); } private void startApkDownload(String downloadUrl) { // 创建DownloadManager请求 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl)); // 设置通知栏标题和描述 request.setTitle("应用更新"); request.setDescription("正在下载最新版本APK"); // 允许媒体扫描,使下载的文件能被系统识别 request.allowScanningByMediaScanner(); // 设置下载完成后显示通知 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // 设置保存路径:外部存储的Download目录,文件名自定义 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "MyAppUpdate.apk"); // 获取DownloadManager服务并加入下载队列 DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); if (downloadManager != null) { downloadManager.enqueue(request); } } }
3. 权限声明(AndroidManifest.xml)
在Manifest中添加必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <!-- Android 10及以上无需WRITE_EXTERNAL_STORAGE,maxSdkVersion设为28 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <!-- 允许安装未知来源应用(Android 8.0+需要) --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
二、通过Google Drive链接实现下载按钮
Google Drive的公开分享链接无法直接用于下载,需要先转换为直接下载链接:
- 原始分享链接格式:
https://drive.google.com/file/d/[FILE_ID]/view?usp=sharing - 转换为直接下载链接:
https://drive.google.com/uc?export=download&id=[FILE_ID]
(替换[FILE_ID]为你文件的实际ID,即原始链接中d/和/view之间的字符串)
基础代码实现
只需将普通链接方案中的APK_DOWNLOAD_URL替换为转换后的Google Drive链接即可,核心代码和权限声明完全一致:
// 替换为转换后的Google Drive直接下载链接 private static final String APK_GOOGLE_DRIVE_URL = "https://drive.google.com/uc?export=download&id=你的文件ID"; // 点击事件中调用startApkDownload(APK_GOOGLE_DRIVE_URL)即可
大文件下载处理(超过100MB)
如果文件较大,Google Drive会弹出确认下载页面,直接使用上述链接会下载HTML文件而非APK,需处理重定向获取Cookie后发起下载:
// 处理大文件下载逻辑(需在子线程执行) private void downloadLargeDriveFile(String fileId) { String cookieUrl = "https://drive.google.com/uc?export=download&id=" + fileId; OkHttpClient client = new OkHttpClient(); Request cookieRequest = new Request.Builder().url(cookieUrl).build(); client.newCall(cookieRequest).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { String cookie = response.header("Set-Cookie"); if (cookie != null) { runOnUiThread(() -> { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(cookieUrl + "&confirm=t")); request.addRequestHeader("Cookie", cookie); // 其余设置和普通下载一致 request.setTitle("应用更新"); request.setDescription("正在下载大文件APK"); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "MyAppUpdate.apk"); DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); if (downloadManager != null) { downloadManager.enqueue(request); } }); } } }); }
(注:使用OkHttpClient需在build.gradle中添加依赖:implementation 'com.squareup.okhttp3:okhttp:4.10.0')
内容的提问来源于stack exchange,提问作者user19521700
相关产品推荐
相关产品推荐

