Unverified 提交 0ca4864c authored 作者: JarvanMo's avatar JarvanMo 提交者: GitHub

Merge pull request #105 from mafanwei/master

Fix issue #88 Make ShareImage Can Use Uint8List
......@@ -22,6 +22,7 @@ public class WechatPluginKeys {
public static final String TITLE = "title";
public static final String IMAGE = "image";
public static final String IMAGE_DATA = "imageData";
public static final String THUMBNAIL = "thumbnail";
public static final String DESCRIPTION = "description";
......
......@@ -15,11 +15,13 @@
*/
package com.jarvan.fluwx.handler
import android.util.Log
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import com.jarvan.fluwx.constant.CallResult
import com.jarvan.fluwx.constant.WeChatPluginMethods
import com.jarvan.fluwx.constant.WechatPluginKeys
import com.jarvan.fluwx.utils.ShareImageUtil
import com.jarvan.fluwx.utils.ThumbnailCompressUtil
import com.jarvan.fluwx.utils.WeChatThumbnailUtil
import com.tencent.mm.opensdk.modelmsg.*
import io.flutter.plugin.common.MethodCall
......@@ -164,13 +166,25 @@ internal class FluwxShareHandler {
}.await()
}
private suspend fun getThumbnailByteArray(imageData: ByteArray): ByteArray {
return GlobalScope.async(Dispatchers.Default, CoroutineStart.DEFAULT) {
val bitmap = BitmapFactory.decodeByteArray(imageData,0,imageData.size)
val bmp = ThumbnailCompressUtil.createScaledBitmapWithRatio(bitmap,WeChatThumbnailUtil.SHARE_IMAGE_THUMB_LENGTH,false)
if (bmp == null) {
byteArrayOf()
} else {
ThumbnailCompressUtil.bmpToByteArray(bmp, Bitmap.CompressFormat.PNG, true)
}
}.await()
}
private fun shareImage(call: MethodCall, result: MethodChannel.Result) {
val imagePath = call.argument<String>(WechatPluginKeys.IMAGE)
val imageData: ByteArray? = call.argument(WechatPluginKeys.IMAGE_DATA)
GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT) {
val byteArray: ByteArray? = if (imagePath.isNullOrBlank()) {
byteArrayOf()
imageData ?: byteArrayOf()
} else {
getImageByteArrayCommon(registrar, imagePath)
}
......@@ -208,11 +222,15 @@ internal class FluwxShareHandler {
var thumbnail: String? = call.argument(WechatPluginKeys.THUMBNAIL)
if (thumbnail.isNullOrBlank()) {
thumbnail = imagePath
val thumbnailData = if (thumbnail.isNullOrBlank() && imageData != null) {
getThumbnailByteArray(imageData)
} else {
if (thumbnail.isNullOrBlank()) {
thumbnail = imagePath
}
getThumbnailByteArrayCommon(registrar, thumbnail!!)
}
val thumbnailData = getThumbnailByteArrayCommon(registrar, thumbnail!!)
// val thumbnailData = Util.bmpToByteArray(bitmap,true)
handleShareImage(imgObj, call, thumbnailData, result)
......
......@@ -197,4 +197,21 @@ public class ThumbnailCompressUtil {
}
public static byte[] bmpToByteArray(final Bitmap bmp, Bitmap.CompressFormat format, final boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(format, 100, output);
if (needRecycle) {
bmp.recycle();
}
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
......@@ -84,7 +84,9 @@ public class WeChatThumbnailUtil {
public static byte[] thumbnailForCommon(String thumbnail, PluginRegistry.Registrar registrar) {
File file;
if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
if(thumbnail == null || thumbnail.isEmpty()) {
return null;
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
file = getAssetFile(thumbnail, registrar);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
String pathWithoutUri = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_FILE.length());
......
......@@ -13,6 +13,7 @@ NSString *const fluwxKeyText = @"text";
NSString *const fluwxKeyTitle = @"title";
NSString *const fluwxKeyImage = @ "image";
NSString *const fluwxKeyImageData = @ "imageData";
NSString *const fluwxKeyThumbnail = @"thumbnail";
NSString *const fluwxKeyDescription = @"description";
......
......@@ -67,10 +67,12 @@ NSObject <FlutterPluginRegistrar> *_registrar;
result(@{fluwxKeyPlatform: fluwxKeyIOS, fluwxKeyResult: @(done)});
}
- (void)shareImage:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *imagePath = call.arguments[fluwxKeyImage];
if ([imagePath hasPrefix:SCHEMA_ASSETS]) {
if ([StringUtil isBlank:imagePath]) {
NSData *imageData = ((FlutterStandardTypedData)call.arguments[fluwxKeyImageData]).data;
[self shareMemoryImage:call result:result imageData:imageData];
} else if ([imagePath hasPrefix:SCHEMA_ASSETS]) {
[self shareAssetImage:call result:result imagePath:imagePath];
} else if ([imagePath hasPrefix:SCHEMA_FILE]) {
[self shareLocalImage:call result:result imagePath:imagePath];
......@@ -81,6 +83,44 @@ NSObject <FlutterPluginRegistrar> *_registrar;
}
- (void)shareMemoryImage:(FlutterMethodCall *)call result:(FlutterResult)result imageData:(NSData *)imageData {
NSString *thumbnail = call.arguments[fluwxKeyThumbnail];
UIImage *thumbnailImage = nil;
if ([StringUtil isBlank:thumbnail]) {
UIImage *tmp = [UIImage imageWithData:imageData];
thumbnailImage = [ThumbnailHelper compressImage:tmp toByte:32 * 1024 isPNG:FALSE];
}
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_async(globalQueue, ^{
if(thumbnailImage == nil)
*thumbnailImage = [self getThumbnail:thumbnail size:32 * 1024];
dispatch_async(dispatch_get_main_queue(), ^{
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendImageData:imageData
TagName:call.arguments[fluwxKeyMediaTagName]
MessageExt:call.arguments[fluwxKeyMessageExt]
Action:call.arguments[fluwxKeyMessageAction]
ThumbImage:thumbnailImage
InScene:[StringToWeChatScene toScene:scene]
title:call.arguments[fluwxKeyTitle]
description:call.arguments[fluwxKeyDescription]
];
result(@{fluwxKeyPlatform: fluwxKeyIOS, fluwxKeyResult: @(done)});
});
});
}
- (void)shareNetworkImage:(FlutterMethodCall *)call result:(FlutterResult)result imagePath:(NSString *)imagePath {
......
......@@ -14,6 +14,7 @@
* limitations under the License.
*/
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/foundation.dart';
......@@ -36,11 +37,7 @@ abstract class WeChatShareModel {
final String mediaTagName;
final WeChatScene scene;
WeChatShareModel(
{this.messageExt,
this.messageAction,
this.mediaTagName,
this.scene: WeChatScene.SESSION});
WeChatShareModel({this.messageExt, this.messageAction, this.mediaTagName, this.scene: WeChatScene.SESSION});
Map toMap();
}
......@@ -54,20 +51,10 @@ class WeChatShareTextModel extends WeChatShareModel {
final String transaction;
///transaction only works on Android.
WeChatShareTextModel(
{String text,
String transaction,
WeChatScene scene,
String messageExt,
String messageAction,
String mediaTagName})
WeChatShareTextModel({String text, String transaction, WeChatScene scene, String messageExt, String messageAction, String mediaTagName})
: this.text = text ?? "",
this.transaction = transaction ?? "text",
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
@override
Map toMap() {
......@@ -127,11 +114,7 @@ class WeChatShareMiniProgramModel extends WeChatShareModel {
assert(webPageUrl != null && webPageUrl.isNotEmpty),
assert(userName != null && userName.isNotEmpty),
assert(path != null && path.isNotEmpty),
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
@override
Map toMap() {
......@@ -159,47 +142,55 @@ class WeChatShareImageModel extends WeChatShareModel {
final String thumbnail;
final String title;
final String description;
final Uint8List imageData;
WeChatShareImageModel(
{String transaction,
@required this.image,
this.description,
String thumbnail,
WeChatScene scene,
String messageExt,
String messageAction,
String mediaTagName,
this.title})
: this.transaction = transaction ?? "text",
WeChatShareImageModel({
String transaction,
@required this.image,
this.description,
String thumbnail,
WeChatScene scene,
String messageExt,
String messageAction,
String mediaTagName,
this.title,
}) : this.transaction = transaction ?? "text",
this.thumbnail = thumbnail ?? "",
assert(image != null),
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
this.imageData = null,
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
WeChatShareImageModel.fromFile(
File imageFile,
{String transaction,
this.description,
String thumbnail,
WeChatScene scene,
String messageExt,
String messageAction,
String mediaTagName,
this.title})
: this.image = "file://${imageFile.path}",
File imageFile, {
String transaction,
this.description,
String thumbnail,
WeChatScene scene,
String messageExt,
String messageAction,
String mediaTagName,
this.title,
}) : this.image = "file://${imageFile.path}",
this.transaction = transaction ?? "text",
this.thumbnail = thumbnail ?? "",
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
this.imageData = null,
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
WeChatShareImageModel.fromUint8List({
@required this.imageData,
String transaction,
this.description,
String thumbnail,
WeChatScene scene,
String messageExt,
String messageAction,
String mediaTagName,
this.title,
}) : this.transaction = transaction ?? "text",
this.thumbnail = thumbnail ?? "",
this.image = "",
assert(imageData != null),
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
@override
Map toMap() {
......@@ -207,6 +198,7 @@ class WeChatShareImageModel extends WeChatShareModel {
_transaction: transaction,
_scene: scene.toString(),
"image": image,
"imageData": imageData,
_thumbnail: thumbnail,
_mediaTagName: mediaTagName,
_messageAction: messageAction,
......@@ -245,11 +237,7 @@ class WeChatShareMusicModel extends WeChatShareModel {
}) : this.transaction = transaction ?? "text",
this.thumbnail = thumbnail ?? "",
assert(musicUrl != null || musicLowBandUrl != null),
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
@override
Map toMap() {
......@@ -299,11 +287,7 @@ class WeChatShareVideoModel extends WeChatShareModel {
this.thumbnail = thumbnail ?? "",
assert(videoUrl != null || videoLowBandUrl != null),
assert(thumbnail != null),
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
@override
Map toMap() {
......@@ -342,11 +326,7 @@ class WeChatShareWebPageModel extends WeChatShareModel {
}) : this.transaction = transaction ?? "text",
assert(webPage != null),
assert(thumbnail != null),
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
@override
Map toMap() {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论