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 { ...@@ -22,6 +22,7 @@ public class WechatPluginKeys {
public static final String TITLE = "title"; public static final String TITLE = "title";
public static final String IMAGE = "image"; public static final String IMAGE = "image";
public static final String IMAGE_DATA = "imageData";
public static final String THUMBNAIL = "thumbnail"; public static final String THUMBNAIL = "thumbnail";
public static final String DESCRIPTION = "description"; public static final String DESCRIPTION = "description";
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
*/ */
package com.jarvan.fluwx.handler 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.CallResult
import com.jarvan.fluwx.constant.WeChatPluginMethods import com.jarvan.fluwx.constant.WeChatPluginMethods
import com.jarvan.fluwx.constant.WechatPluginKeys import com.jarvan.fluwx.constant.WechatPluginKeys
import com.jarvan.fluwx.utils.ShareImageUtil import com.jarvan.fluwx.utils.ShareImageUtil
import com.jarvan.fluwx.utils.ThumbnailCompressUtil
import com.jarvan.fluwx.utils.WeChatThumbnailUtil import com.jarvan.fluwx.utils.WeChatThumbnailUtil
import com.tencent.mm.opensdk.modelmsg.* import com.tencent.mm.opensdk.modelmsg.*
import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodCall
...@@ -164,13 +166,25 @@ internal class FluwxShareHandler { ...@@ -164,13 +166,25 @@ internal class FluwxShareHandler {
}.await() }.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) { private fun shareImage(call: MethodCall, result: MethodChannel.Result) {
val imagePath = call.argument<String>(WechatPluginKeys.IMAGE) val imagePath = call.argument<String>(WechatPluginKeys.IMAGE)
val imageData: ByteArray? = call.argument(WechatPluginKeys.IMAGE_DATA)
GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT) { GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT) {
val byteArray: ByteArray? = if (imagePath.isNullOrBlank()) { val byteArray: ByteArray? = if (imagePath.isNullOrBlank()) {
byteArrayOf() imageData ?: byteArrayOf()
} else { } else {
getImageByteArrayCommon(registrar, imagePath) getImageByteArrayCommon(registrar, imagePath)
} }
...@@ -208,11 +222,15 @@ internal class FluwxShareHandler { ...@@ -208,11 +222,15 @@ internal class FluwxShareHandler {
var thumbnail: String? = call.argument(WechatPluginKeys.THUMBNAIL) var thumbnail: String? = call.argument(WechatPluginKeys.THUMBNAIL)
val thumbnailData = if (thumbnail.isNullOrBlank() && imageData != null) {
getThumbnailByteArray(imageData)
} else {
if (thumbnail.isNullOrBlank()) { if (thumbnail.isNullOrBlank()) {
thumbnail = imagePath thumbnail = imagePath
} }
getThumbnailByteArrayCommon(registrar, thumbnail!!)
}
val thumbnailData = getThumbnailByteArrayCommon(registrar, thumbnail!!)
// val thumbnailData = Util.bmpToByteArray(bitmap,true) // val thumbnailData = Util.bmpToByteArray(bitmap,true)
handleShareImage(imgObj, call, thumbnailData, result) handleShareImage(imgObj, call, thumbnailData, result)
......
...@@ -197,4 +197,21 @@ public class ThumbnailCompressUtil { ...@@ -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 { ...@@ -84,7 +84,9 @@ public class WeChatThumbnailUtil {
public static byte[] thumbnailForCommon(String thumbnail, PluginRegistry.Registrar registrar) { public static byte[] thumbnailForCommon(String thumbnail, PluginRegistry.Registrar registrar) {
File file; 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); file = getAssetFile(thumbnail, registrar);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) { } else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
String pathWithoutUri = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_FILE.length()); String pathWithoutUri = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_FILE.length());
......
...@@ -13,6 +13,7 @@ NSString *const fluwxKeyText = @"text"; ...@@ -13,6 +13,7 @@ NSString *const fluwxKeyText = @"text";
NSString *const fluwxKeyTitle = @"title"; NSString *const fluwxKeyTitle = @"title";
NSString *const fluwxKeyImage = @ "image"; NSString *const fluwxKeyImage = @ "image";
NSString *const fluwxKeyImageData = @ "imageData";
NSString *const fluwxKeyThumbnail = @"thumbnail"; NSString *const fluwxKeyThumbnail = @"thumbnail";
NSString *const fluwxKeyDescription = @"description"; NSString *const fluwxKeyDescription = @"description";
......
...@@ -67,10 +67,12 @@ NSObject <FlutterPluginRegistrar> *_registrar; ...@@ -67,10 +67,12 @@ NSObject <FlutterPluginRegistrar> *_registrar;
result(@{fluwxKeyPlatform: fluwxKeyIOS, fluwxKeyResult: @(done)}); result(@{fluwxKeyPlatform: fluwxKeyIOS, fluwxKeyResult: @(done)});
} }
- (void)shareImage:(FlutterMethodCall *)call result:(FlutterResult)result { - (void)shareImage:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *imagePath = call.arguments[fluwxKeyImage]; 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]; [self shareAssetImage:call result:result imagePath:imagePath];
} else if ([imagePath hasPrefix:SCHEMA_FILE]) { } else if ([imagePath hasPrefix:SCHEMA_FILE]) {
[self shareLocalImage:call result:result imagePath:imagePath]; [self shareLocalImage:call result:result imagePath:imagePath];
...@@ -81,6 +83,44 @@ NSObject <FlutterPluginRegistrar> *_registrar; ...@@ -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 { - (void)shareNetworkImage:(FlutterMethodCall *)call result:(FlutterResult)result imagePath:(NSString *)imagePath {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
import 'dart:io'; import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
...@@ -36,11 +37,7 @@ abstract class WeChatShareModel { ...@@ -36,11 +37,7 @@ abstract class WeChatShareModel {
final String mediaTagName; final String mediaTagName;
final WeChatScene scene; final WeChatScene scene;
WeChatShareModel( WeChatShareModel({this.messageExt, this.messageAction, this.mediaTagName, this.scene: WeChatScene.SESSION});
{this.messageExt,
this.messageAction,
this.mediaTagName,
this.scene: WeChatScene.SESSION});
Map toMap(); Map toMap();
} }
...@@ -54,20 +51,10 @@ class WeChatShareTextModel extends WeChatShareModel { ...@@ -54,20 +51,10 @@ class WeChatShareTextModel extends WeChatShareModel {
final String transaction; final String transaction;
///transaction only works on Android. ///transaction only works on Android.
WeChatShareTextModel( WeChatShareTextModel({String text, String transaction, WeChatScene scene, String messageExt, String messageAction, String mediaTagName})
{String text,
String transaction,
WeChatScene scene,
String messageExt,
String messageAction,
String mediaTagName})
: this.text = text ?? "", : this.text = text ?? "",
this.transaction = transaction ?? "text", this.transaction = transaction ?? "text",
super( super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
@override @override
Map toMap() { Map toMap() {
...@@ -127,11 +114,7 @@ class WeChatShareMiniProgramModel extends WeChatShareModel { ...@@ -127,11 +114,7 @@ class WeChatShareMiniProgramModel extends WeChatShareModel {
assert(webPageUrl != null && webPageUrl.isNotEmpty), assert(webPageUrl != null && webPageUrl.isNotEmpty),
assert(userName != null && userName.isNotEmpty), assert(userName != null && userName.isNotEmpty),
assert(path != null && path.isNotEmpty), assert(path != null && path.isNotEmpty),
super( super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
@override @override
Map toMap() { Map toMap() {
...@@ -159,9 +142,10 @@ class WeChatShareImageModel extends WeChatShareModel { ...@@ -159,9 +142,10 @@ class WeChatShareImageModel extends WeChatShareModel {
final String thumbnail; final String thumbnail;
final String title; final String title;
final String description; final String description;
final Uint8List imageData;
WeChatShareImageModel( WeChatShareImageModel({
{String transaction, String transaction,
@required this.image, @required this.image,
this.description, this.description,
String thumbnail, String thumbnail,
...@@ -169,37 +153,44 @@ class WeChatShareImageModel extends WeChatShareModel { ...@@ -169,37 +153,44 @@ class WeChatShareImageModel extends WeChatShareModel {
String messageExt, String messageExt,
String messageAction, String messageAction,
String mediaTagName, String mediaTagName,
this.title}) this.title,
: this.transaction = transaction ?? "text", }) : this.transaction = transaction ?? "text",
this.thumbnail = thumbnail ?? "", this.thumbnail = thumbnail ?? "",
assert(image != null), assert(image != null),
super( this.imageData = null,
mediaTagName: mediaTagName, super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
WeChatShareImageModel.fromFile( WeChatShareImageModel.fromFile(
File imageFile, File imageFile, {
{String transaction, String transaction,
this.description, this.description,
String thumbnail, String thumbnail,
WeChatScene scene, WeChatScene scene,
String messageExt, String messageExt,
String messageAction, String messageAction,
String mediaTagName, String mediaTagName,
this.title}) this.title,
: this.image = "file://${imageFile.path}", }) : this.image = "file://${imageFile.path}",
this.transaction = transaction ?? "text", this.transaction = transaction ?? "text",
this.thumbnail = thumbnail ?? "", this.thumbnail = thumbnail ?? "",
super( this.imageData = null,
mediaTagName: mediaTagName, super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
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 @override
Map toMap() { Map toMap() {
...@@ -207,6 +198,7 @@ class WeChatShareImageModel extends WeChatShareModel { ...@@ -207,6 +198,7 @@ class WeChatShareImageModel extends WeChatShareModel {
_transaction: transaction, _transaction: transaction,
_scene: scene.toString(), _scene: scene.toString(),
"image": image, "image": image,
"imageData": imageData,
_thumbnail: thumbnail, _thumbnail: thumbnail,
_mediaTagName: mediaTagName, _mediaTagName: mediaTagName,
_messageAction: messageAction, _messageAction: messageAction,
...@@ -245,11 +237,7 @@ class WeChatShareMusicModel extends WeChatShareModel { ...@@ -245,11 +237,7 @@ class WeChatShareMusicModel extends WeChatShareModel {
}) : this.transaction = transaction ?? "text", }) : this.transaction = transaction ?? "text",
this.thumbnail = thumbnail ?? "", this.thumbnail = thumbnail ?? "",
assert(musicUrl != null || musicLowBandUrl != null), assert(musicUrl != null || musicLowBandUrl != null),
super( super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
@override @override
Map toMap() { Map toMap() {
...@@ -299,11 +287,7 @@ class WeChatShareVideoModel extends WeChatShareModel { ...@@ -299,11 +287,7 @@ class WeChatShareVideoModel extends WeChatShareModel {
this.thumbnail = thumbnail ?? "", this.thumbnail = thumbnail ?? "",
assert(videoUrl != null || videoLowBandUrl != null), assert(videoUrl != null || videoLowBandUrl != null),
assert(thumbnail != null), assert(thumbnail != null),
super( super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
@override @override
Map toMap() { Map toMap() {
...@@ -342,11 +326,7 @@ class WeChatShareWebPageModel extends WeChatShareModel { ...@@ -342,11 +326,7 @@ class WeChatShareWebPageModel extends WeChatShareModel {
}) : this.transaction = transaction ?? "text", }) : this.transaction = transaction ?? "text",
assert(webPage != null), assert(webPage != null),
assert(thumbnail != null), assert(thumbnail != null),
super( super(mediaTagName: mediaTagName, messageAction: messageAction, messageExt: messageExt, scene: scene);
mediaTagName: mediaTagName,
messageAction: messageAction,
messageExt: messageExt,
scene: scene);
@override @override
Map toMap() { Map toMap() {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论