import 'dart:convert';
|
import 'dart:io';
|
|
import 'package:dio/dio.dart';
|
import 'package:flutter/services.dart';
|
import 'package:flutter/widgets.dart';
|
import '../api/http.dart' as http;
|
import '../utils/encrypt_util.dart';
|
import '../utils/permission_util.dart';
|
import '../utils/share_utils.dart';
|
import '../utils/string_util.dart';
|
import '../utils/ui_constant.dart';
|
import '../utils/ui_utils.dart';
|
import '../utils/user_util.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
import 'package:webview_flutter/platform_interface.dart';
|
import 'package:webview_flutter/webview_flutter.dart';
|
import 'package:path_provider/path_provider.dart';
|
import '../ui/widget/nav.dart';
|
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
|
import 'config_util.dart';
|
import 'package:package_info/package_info.dart';
|
|
class JavascriptInterface {
|
final BuildContext context;
|
final WebViewController? _controller;
|
|
JavascriptInterface(
|
BuildContext this.context, WebViewController? this._controller);
|
|
Set<JavascriptChannel> getInterfaces() {
|
List<JavascriptChannel> list = [];
|
list.add(JavascriptChannel(
|
name: 'yestv',
|
onMessageReceived: (JavascriptMessage message) {
|
print("onMessageReceived");
|
var data = jsonDecode(message.message);
|
String method = data["method"];
|
var params = data["params"];
|
String? _callback = data["callback"];
|
switch (method) {
|
case "toast":
|
toast(params);
|
break;
|
case "copyText":
|
copyText(params);
|
break;
|
case "getUid":
|
getUid(params, _callback);
|
break;
|
case "getAppName":
|
getAppName(_callback);
|
break;
|
case "getRequestBaseParams":
|
getRequestBaseParams(params, _callback);
|
break;
|
case "showRewardVideoAd":
|
showRewardVideoAd(this.context, _callback);
|
break;
|
case "showLoading":
|
showLoading();
|
break;
|
case "hideLoading":
|
hideLoading();
|
break;
|
case "finishPage":
|
finishPage();
|
break;
|
case "saveImg":
|
String url = params["url"];
|
saveImg(url);
|
break;
|
case "shareImg":
|
String url = params["url"];
|
String type = params["type"];
|
shareImg(url, int.parse(type));
|
break;
|
}
|
}));
|
return list.toSet();
|
}
|
|
callback(String method, var params, {bool finish = true}) {
|
_controller!.runJavascript("$method('$params')");
|
if (finish) {
|
_controller!.runJavascript("delete $method");
|
}
|
}
|
|
//获取用户ID
|
getUid(var params, String? callbackName) {
|
if (callbackName != null) {
|
UserUtil.getUid().then((value) {
|
callback(callbackName, value != null ? value.toString() : "");
|
});
|
}
|
}
|
|
//获取用户ID
|
getAppName(String? callbackName) {
|
//
|
PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
|
if (callbackName != null) {
|
callback(callbackName, packageInfo.appName);
|
}
|
});
|
}
|
|
//toast
|
toast(params) {
|
if (params != null && params["msg"] != null) {
|
ToastUtil.toast(params["msg"], context);
|
}
|
}
|
|
copyText(params) {
|
if (params != null && params["content"] != null) {
|
Clipboard.setData(ClipboardData(text: params["content"]));
|
}
|
}
|
|
//获取基本的网络请求参数
|
getRequestBaseParams(var params, String? callbackName) {
|
var ps = {};
|
if (params != null) {
|
ps.addAll(params);
|
}
|
http.HttpUtil.getBaseParams(params).then((value) {
|
String result = jsonEncode(value);
|
if (callbackName != null) {
|
callback(callbackName, result);
|
}
|
});
|
}
|
|
//展示激励视频
|
showRewardVideoAd(BuildContext context, String? callbackName) {
|
// AdUtil.getAdInfo(context, AdPosition.vipReward).then((value) {
|
// AdUtil.loadReward(value, (status, msg) {
|
// switch (status) {
|
// case RewardAdStatus.verify:
|
// callback(callbackName!, 3, finish: false);
|
// break;
|
// case RewardAdStatus.ready:
|
// callback(callbackName!, 1, finish: false);
|
// break;
|
// case RewardAdStatus.close:
|
// callback(callbackName!, 10, finish: true);
|
// break;
|
// case RewardAdStatus.click:
|
// callback(callbackName!, 2, finish: false);
|
// break;
|
// case RewardAdStatus.fail:
|
// callback(callbackName!, 0, finish: true);
|
// break;
|
// }
|
// });
|
// });
|
}
|
|
showLoading() {
|
http.showLoading(context);
|
}
|
|
hideLoading() {
|
popPage(context);
|
}
|
|
//结束页面
|
finishPage() {
|
popPage(context);
|
}
|
|
Future<bool> _dowloadImg(String url, String path) async {
|
PermissionStatus status =
|
await PermissionUtil.openPermission(Permission.storage, force: true);
|
if (status != PermissionStatus.granted) {
|
return false;
|
}
|
|
//下载图片
|
Dio dio = Dio();
|
//设置连接超时时间
|
dio.options.connectTimeout = 20000;
|
//设置数据接收超时时间
|
dio.options.receiveTimeout = 20000;
|
Response response;
|
try {
|
response = await dio.download(url, path);
|
if (response.statusCode == 200) {
|
await ImageGallerySaver.saveFile(path);
|
return true;
|
} else {
|
return false;
|
}
|
} catch (e) {
|
ToastUtil.toast("网络连接失败", context);
|
return false;
|
}
|
}
|
|
//保存图片
|
saveImg(String url) {
|
Future<Directory?> dir;
|
if (Platform.isAndroid) {
|
dir = getExternalStorageDirectory();
|
} else {
|
dir = getApplicationDocumentsDirectory();
|
}
|
dir.then((value) {
|
if (value == null) {
|
ToastUtil.toast("获取缓存目录失败", context);
|
return;
|
}
|
|
String doc = value.path;
|
String path = doc + "/" + EncryptUtil.MD5(url) + ".png";
|
_dowloadImg(url, path).then((value) {
|
if (value) {
|
ToastUtil.toast("保存成功", context);
|
}
|
});
|
});
|
}
|
|
///分享图片
|
///type: 1-微信 2-qq 3-新浪
|
shareImg(String url, int type) {
|
getTemporaryDirectory().then((value) {
|
String path = value.path + "/" + EncryptUtil.MD5(url) + ".png";
|
_dowloadImg(url, path).then((value) {
|
if (value) {
|
//开始分享
|
switch (type) {
|
case 1:
|
ShareUtil.shareImg(context, File(path), SharePlatform.wx);
|
break;
|
case 2:
|
ShareUtil.shareImg(context, File(path), SharePlatform.qq);
|
break;
|
case 3:
|
ShareUtil.shareImg(context, File(path), SharePlatform.sina);
|
break;
|
}
|
}
|
});
|
});
|
}
|
}
|