You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Cordova应用中向他人分享自身APK文件

我太懂这种无奈了——那些现成的分享插件只能传传文字和链接,完全没法直接分享APK安装包,难怪你要自己动手搞自定义插件。既然你已经有能在MainActivity里跑通的Java代码了,把它改成Cordova插件其实没那么复杂,我一步步给你拆解清楚:

第一步:搭建Cordova插件的基础结构

先通过plugman快速生成插件骨架(如果没装plugman,先跑npm install -g plugman):

plugman create --name ShareApkPlugin --plugin_id com.yourdomain.shareapk --plugin_version 1.0.0

进入插件目录后,添加Android平台支持:

cd ShareApkPlugin
plugman platform add --platform_name android
第二步:替换Android端的核心Java代码

找到插件目录下的src/android/ShareApkPlugin.java,把默认代码替换成包含APK分享逻辑的实现——这里直接整合你现有的可用代码,同时适配Cordova的插件回调机制:

package com.yourdomain.shareapk;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import androidx.core.content.FileProvider;
import java.io.File;

public class ShareApkPlugin extends CordovaPlugin {

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        // 只响应"shareApk"这个JS调用动作
        if (action.equals("shareApk")) {
            shareCurrentAppApk(callbackContext);
            return true;
        }
        callbackContext.error("无效的调用动作: " + action);
        return false;
    }

    private void shareCurrentAppApk(CallbackContext callbackContext) {
        try {
            // 获取当前应用APK的本地路径
            String apkFilePath = cordova.getActivity().getPackageManager()
                    .getApplicationInfo(cordova.getActivity().getPackageName(), 0).sourceDir;
            File apkFile = new File(apkFilePath);

            Uri apkUri;
            // Android 7.0及以上必须用FileProvider分享文件
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                apkUri = FileProvider.getUriForFile(
                        cordova.getActivity(),
                        cordova.getActivity().getPackageName() + ".fileprovider",
                        apkFile
                );
            } else {
                apkUri = Uri.fromFile(apkFile);
            }

            // 构建分享Intent
            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("application/vnd.android.package-archive");
            shareIntent.putExtra(Intent.EXTRA_STREAM, apkUri);
            // 授予临时读取权限给接收分享的应用
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

            // 启动系统分享选择器
            cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "分享APK安装包"));
            callbackContext.success("分享界面已启动");
        } catch (Exception e) {
            callbackContext.error("分享失败: " + e.getMessage());
        }
    }
}
第三步:配置FileProvider(适配Android 7+)

Android 7.0开始禁止直接分享本地文件路径,必须通过FileProvider来实现,这一步要补两个配置:

  1. 在插件目录下创建res/xml/file_paths.xml,定义可分享的文件路径:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path name="root" path="."/>
</paths>
  1. 修改插件的plugin.xml,把FileProvider配置注入到项目的AndroidManifest.xml中(后面会统一整理plugin.xml的完整配置)。
第四步:完善插件的plugin.xml配置

这个文件是Cordova插件的核心配置,要确保正确引用Java代码、资源文件和权限:

<?xml version='1.0' encoding='utf-8'?>
<plugin id="com.yourdomain.shareapk" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
    <name>ShareApkPlugin</name>
    <!-- JS接口配置,让前端能通过window.ShareApkPlugin调用 -->
    <js-module name="ShareApkPlugin" src="www/ShareApkPlugin.js">
        <clobbers target="window.ShareApkPlugin" />
    </js-module>

    <platform name="android">
        <!-- 注入FileProvider的路径配置文件 -->
        <resource-file src="res/xml/file_paths.xml" target="res/xml/file_paths.xml" />
        <!-- 注入FileProvider到AndroidManifest -->
        <config-file parent="/manifest/application" target="AndroidManifest.xml">
            <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="${applicationId}.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths"/>
            </provider>
        </config-file>
        <!-- 指定Java代码的目标路径 -->
        <source-file src="src/android/ShareApkPlugin.java" target-dir="src/com/yourdomain/shareapk" />
    </platform>
</plugin>
第五步:编写JS调用接口

修改插件目录下的www/ShareApkPlugin.js,封装原生方法的调用入口:

var exec = require('cordova/exec');

var ShareApkPlugin = {
    // 定义分享APK的方法,接收成功和失败回调
    shareApk: function(successCallback, errorCallback) {
        exec(successCallback, errorCallback, 'ShareApkPlugin', 'shareApk', []);
    }
};

module.exports = ShareApkPlugin;
第六步:安装插件到你的Cordova项目

回到你的Cordova应用根目录,运行以下命令安装自定义插件:

cordova plugin add /本地路径/到/你的/ShareApkPlugin
第七步:在前端代码中调用插件

在你的HTML/JS里,通过按钮或其他触发事件调用分享功能:

// 假设页面有个id为share-apk-btn的按钮
document.getElementById('share-apk-btn').addEventListener('click', function() {
    window.ShareApkPlugin.shareApk(
        function(msg) {
            console.log('分享成功提示:', msg);
        },
        function(err) {
            console.error('分享出错:', err);
        }
    );
});

几个注意事项

  • 确保你的Cordova项目已启用AndroidX:如果遇到依赖问题,可以安装cordova-plugin-androidx插件来适配。
  • 一定要在真实设备上测试:模拟器的分享功能可能存在兼容性问题。
  • Android 10+无需额外存储权限:因为我们读取的是应用自身的APK文件,属于应用私有目录,不需要申请READ_EXTERNAL_STORAGE权限。

内容的提问来源于stack exchange,提问作者Merbin Joe

火山引擎 最新活动