Android原生代码

CommonConstants.java

package com.ifoxsmartfactory;import android.os.Environment;import java.io.File;public class CommonConstants {private static final String DEMO_PATH = Environment.getExternalStorageDirectory() + "/download" + File.separator;public static final String DOWNLOAD_PATH = DEMO_PATH + File.separator + "download" + File.separator;
}

UpdateService.java

import android.util.Log;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class UpdateService {private static OkHttpClient okHttpClient;public static void download(final String url, final String fileName, final UpdateCallback callback) {Log.e("url==", url + "");Request request = new Request.Builder().addHeader("Accept-Encoding", "identity").url(url).build();if (okHttpClient == null) {okHttpClient = new OkHttpClient();}okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callback.onFailure();}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.body() == null) {callback.onFailure();return;}File filePath = new File(CommonConstants.DOWNLOAD_PATH);if (!filePath.exists()) {filePath.mkdirs();}Log.e("filePath:", filePath + "");long contentLength = response.body().contentLength();byte[] buffer = new byte[1024];File file = new File(filePath.getCanonicalPath(), fileName);try (InputStream is = response.body().byteStream();FileOutputStream fos = new FileOutputStream(file)) {Log.e("保存路径:", file + "");int length;long sum = 0;while ((length = is.read(buffer)) != -1) {fos.write(buffer, 0, length);sum += length;int progress = (int) (sum * 1.0f / contentLength * 100);callback.onProgress(progress);}fos.flush();callback.onSuccess();} catch (Exception e) {Log.e("error:",e.getMessage());callback.onFailure();}}});}public interface UpdateCallback {void onSuccess();void onProgress(int progress);void onFailure();}
}

AppDownLoad.java

import android.content.Intent;import androidx.annotation.NonNull;import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;public class AppDownLoad extends ReactContextBaseJavaModule {@NonNull@Overridepublic String getName() {return "AppDownLoad";}private static ReactApplicationContext reactContext;public AppDownLoad(ReactApplicationContext context){super(context);reactContext=context;}@ReactMethodpublic void downloading(String url,String updateInfo){Intent intent = new Intent(reactContext, DownLoadActivity.class);intent.putExtra("url",url);intent.putExtra("updateInfo",updateInfo);// 由于没有在Activity环境下启动Activity,设置下面的标签intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);reactContext.startActivity(intent);}
}

DownLoadActivity.java

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;import java.io.File;public class DownLoadActivity extends Activity {private Context context;private AlertDialog mDialog;public DownLoadActivity() {}public DownLoadActivity(Context context) {this.context = context;}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent=getIntent();String url=intent.getStringExtra("url");String updateInfo=intent.getStringExtra("updateInfo");Log.e("url:",url);Log.e("updateInfo:",updateInfo);final ProgressDialog dialog = new ProgressDialog(this);dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);dialog.setCanceledOnTouchOutside(false);dialog.setCancelable(true);dialog.setTitle("正在下载");dialog.setMessage(updateInfo+"");dialog.setProgress(0);dialog.setMax(100);dialog.show();UpdateService.download(url,updateInfo, new UpdateService.UpdateCallback() {@Overridepublic void onSuccess() {dialog.dismiss();Log.e("onSuccess:","success");if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {dialog.dismiss();return;}File file = new File(CommonConstants.DOWNLOAD_PATH + updateInfo);try {Log.e("安装文件目录:", file + "");installApk(file);} catch (Exception e) {Log.e("获取打开方式错误", e + "");finish();}}@Overridepublic void onProgress(int progress) {dialog.setProgress(progress);}@Overridepublic void onFailure() {Log.e("onFailure:","true");dialog.dismiss();finish();}});}private void installApk(File file) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri fileUri;//Android7.0以上if (Build.VERSION.SDK_INT >= 24) {fileUri = FileProvider.getUriForFile(this,BuildConfig.APPLICATION_ID + "" + ".fileprovider", file);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);} else {fileUri = Uri.fromFile(file);}intent.setDataAndType(fileUri, "application/vnd.android.package-archive");startActivity(intent);finish();}
}

DownloadApkPackage.java

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.ReactApplicationContext;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class DownloadApkPackage implements ReactPackage {@Overridepublic List createNativeModules(ReactApplicationContext reactContext) {List modules = new ArrayList<>();modules.add(new AppDownLoad(reactContext));return modules;}// @Overridepublic List createJSModules() {return Collections.emptyList();}@Overridepublic List createViewManagers(ReactApplicationContext reactContext) {return Collections.emptyList();}
}

RN代码

AppDownLoad.js

import { NativeModules } from 'react-native';
export default NativeModules.AppDownLoad;

在RN代码中引用

DownloadApk.downloading(appDownloadUrl, appPackage);

React-Native 实现安卓下载软件相关推荐

  1. React Native适配安卓IOS刘海屏、异形屏方案

    首先顶部引入这几个模块 import {Platform,SafeAreaView,NativeModules,StatusBar } from "react-native"; c ...

  2. Windows环境下搭建React Native

    随着移动开发越来越火热,前端开发也是有之前11年一直火热到现在,不过我发现从去年年底开发,Android和ios基本已经饱和了,特别是随着广大开源社区的中很多人贡献代码,开发已经不是什么问题了,所以现 ...

  3. react native 包学不包会系列--认识react native

    react native 是由Facebook推出,基于JavaScript框架和React库来提高多平台开发效率的一门语言.很好地填补了跨平台开发的空缺,推出之后也是收到很多开发者的关注,目前使用的 ...

  4. React Native与React的关系及特点

    一.React.React.js和React Native的关系 React是基础框架,是一套基础设计实现理念,开发者不能直接使用它来开发移动应用或网页. 在React之上发展出了React.js框架 ...

  5. React Native初探

    React Native初探 转自:博客园 叶小钗  前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP ...

  6. React Native入门 基础使用总结

    1.router: react-native-router-flux 基于react-navigation/native 二次封装 2.字体图标:react-native-vector-icons(推 ...

  7. React Native开源项目如何运行(附一波开源项目)

    学习任何技术,最快捷的方法就是学习完基础语法,然后模仿开源项目进行学习,React Native也不例外.React Native推出了1年多了, 开源项目太多了,我们以其中一个举例子.给大家演示下如 ...

  8. chrome android版 插件下载,Chrome安卓下载

    Chrome安卓下载是一款谷歌开发的网页浏览软件.这里页面加载速度是非常快的,想要搜索的内容都可以快速的找到,对页面打开的数量也是没有限制的,可以轻松的进行页面切换.感兴趣的话就不要犹豫了,不妨来下载 ...

  9. [译]哪个跨平台框架才是最好的选择?React Native、Flutter 还是 Ionic

    关注 前端瓶子君,回复"交流" 加入我们一起学习,天天进步 原文地址:React Native vs. Flutter vs. Ionic 原文作者:Sophia Martin 译 ...

最新文章

  1. windows 下mysql的安装于使用(启动、关闭)
  2. 如何用简单的词语和用法解释Katana和OWIN?
  3. 滴滴笔试准备 项目分配利益最大化
  4. Python eval 函数 - Python零基础入门教程
  5. ssm框架搭建+easyui增删改查实现
  6. TCP协议连环12问
  7. java中关于线程的状态属性_深入理解Java多线程与并发框(第①篇)——线程的状态...
  8. opencv 直方图
  9. 高德百度坐标系转换方法
  10. Linux基础——Linux 基本指令 nano 和 cat
  11. Mac上如何重启或结束Finder进程?
  12. 【Django 2021年最新版教程25】模板语言 前端for循环怎么用 实例
  13. 最新版idea2017+kemulator搭建J2ME开发环境
  14. 利用pdfminer3k 使用python语言提取PDF中的文本
  15. mapbox加载高程图结果谷歌浏览器提示无法初始化WebGl???
  16. Qt5.14.2下载与安装(保姆级图文教程)
  17. 利用systemstate dump trace文件寻找dg terminated原因
  18. 通过bitmap改变图片的大小
  19. 全网刷屏的可达鸭,单个炒到2000元?湖北人要错过了?
  20. [9i] 猪年说猪,属相,本命年,十二生肖用英语该怎么说

热门文章

  1. uniapp实现简单的锚点定位
  2. python实现登录支付宝收能量_适合零基础人群学习的Python入门教程
  3. Oculus Touch再度被坑,这次是电商Saturn流出上架信息
  4. R语言机器学习mlr3:模型评价和比较
  5. PhotoShop,gif动图去背景及导出
  6. 景联文科技提供自动驾驶路况信息采集服务
  7. HTML 表格标签、列表标签、表单标签(案例: 注册页面)
  8. 在C#中,为什么大家用httpcontext.current,不直接用HttpContext
  9. 2023新财富500富人:钟睒睒再夺首富,马云重回前十,王传福排名第11 —— 第2富的字节跳动的一鸣同学好年轻
  10. php家居装饰装修系统_我如何为家居装饰品牌建立最快的电子商务商店[第4部分]...