提交 30186a5e authored 作者: JarvanMo's avatar JarvanMo

share thumbnails ok

上级 b7fbd402
......@@ -50,7 +50,6 @@ object WeChatPluginHandler {
fun handle(call: MethodCall, result: MethodChannel.Result) {
Log.e("---",call.method)
if (!wxApi!!.isWXAppInstalled) {
result.error(CallResult.RESULT_WE_CHAT_NOT_INSTALLED, CallResult.RESULT_WE_CHAT_NOT_INSTALLED, null)
return
......@@ -98,16 +97,15 @@ object WeChatPluginHandler {
val msg = WXMediaMessage(miniProgramObj)
msg.title = call.argument("title") // 小程序消息title
msg.description = call.argument("description") // 小程序消息desc
var thumbnail: String? = call.argument(WechatPluginKeys.THUMBNAIL)
thumbnail = thumbnail ?: ""
val thumbnail: String? = call.argument(WechatPluginKeys.THUMBNAIL)
launch {
if (thumbnail.isNullOrBlank()) {
msg.thumbData = null
} else {
msg.thumbData = WeChatThumbnailUtil.thumbnailForMiniProgram(thumbnail, registrar)
msg.thumbData = getThumbnailByteArrayMiniProgram(registrar,thumbnail!!)
}
val req = SendMessageToWX.Req()
setCommonArguments(call, req, msg)
req.message = msg
......@@ -116,6 +114,16 @@ object WeChatPluginHandler {
}
}
private suspend fun getThumbnailByteArrayMiniProgram(registrar: PluginRegistry.Registrar?,thumbnail:String):ByteArray{
return async(CommonPool) {
val result = WeChatThumbnailUtil.thumbnailForMiniProgram(thumbnail, registrar)
result?: byteArrayOf()
}.await()
}
private suspend fun getImageByteArrayCommon(registrar: PluginRegistry.Registrar?,imagePath:String):ByteArray{
return async(CommonPool){
val result = ShareImageUtil.getImageData(registrar, imagePath)
......
......@@ -3,7 +3,6 @@ package com.jarvan.fluwx.utils;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import com.jarvan.fluwx.constant.WeChatPluginImageSchema;
......@@ -12,12 +11,10 @@ import com.jarvan.fluwx.constant.WechatPluginKeys;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.UUID;
import io.flutter.plugin.common.PluginRegistry;
......@@ -32,85 +29,64 @@ import okio.Source;
import top.zibin.luban.Luban;
public class WeChatThumbnailUtil {
public static final int SHARE_MINI_PROGRAM_IMAGE_THUMB_LENGTH = 120;
public static final int MINI_PROGRAM_SCALED_WIDTH = 480;
public static final int SHARE_IMAGE_THUMB_LENGTH = 32;
private static final int COMMON_THUMB_WIDTH = 10;
private static final int COMMON_THUMB_WIDTH = 150;
private WeChatThumbnailUtil() {
}
public static byte[] thumbnailForMiniProgram(String thumbnail, PluginRegistry.Registrar registrar) {
byte[] result = null;
File file;
if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
result = fromAssetForMiniProgram(thumbnail, registrar);
file = getAssetFile(thumbnail, registrar);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
file = new File(thumbnail);
} else {
file = downloadImage(thumbnail);
}
return result;
return compress(file, registrar,SHARE_MINI_PROGRAM_IMAGE_THUMB_LENGTH,MINI_PROGRAM_SCALED_WIDTH);
}
private static byte[] fromAssetForMiniProgram(String thumbnail, PluginRegistry.Registrar registrar) {
byte[] result = null;
String key = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length(), thumbnail.length());
AssetFileDescriptor fileDescriptor = AssetManagerUtil.openAsset(registrar, key, getPackage(key));
if (fileDescriptor != null && fileDescriptor.getLength() <= 128 * 1024) {
try {
Source source = Okio.source(fileDescriptor.createInputStream());
result = Okio.buffer(source).readByteArray();
source.close();
} catch (IOException e) {
e.printStackTrace();
}
} else if (fileDescriptor != null && fileDescriptor.getLength() > 128 * 1024) {
File file = FileUtil.createTmpFile(fileDescriptor);
if (file == null) {
return null;
}
File snapshot = CompressImageUtil.compressUtilSmallerThan(128, file, registrar.context());
if (snapshot == null) {
return null;
}
try {
result = Okio.buffer(Okio.source(snapshot)).readByteArray();
} catch (IOException e) {
e.printStackTrace();
}
File file;
if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
file = getAssetFile(thumbnail, registrar);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
file = new File(thumbnail);
} else {
file = downloadImage(thumbnail);
}
return result;
return compress(file, registrar,SHARE_MINI_PROGRAM_IMAGE_THUMB_LENGTH,MINI_PROGRAM_SCALED_WIDTH);
}
public static byte[] thumbnailForCommon(String thumbnail, PluginRegistry.Registrar registrar) {
File file;
if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
file = fromAssetForCommon(thumbnail, registrar);
file = getAssetFile(thumbnail, registrar);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
file = new File(thumbnail);
} else {
file = downloadImage(thumbnail);
}
return compress(file, registrar);
return compress(file, registrar,SHARE_IMAGE_THUMB_LENGTH,COMMON_THUMB_WIDTH);
}
private static byte[] compress(File file, PluginRegistry.Registrar registrar) {
private static byte[] compress(File file, PluginRegistry.Registrar registrar,int resultMaxLength,int scaledWidth) {
if (file == null) {
return new byte[]{};
}
int size = SHARE_IMAGE_THUMB_LENGTH * 1024;
try {
File compressedFile = Luban
.with(registrar.context())
.ignoreBy(SHARE_IMAGE_THUMB_LENGTH)
.ignoreBy(resultMaxLength)
.setTargetDir(registrar.context().getCacheDir().getAbsolutePath())
.get(file.getAbsolutePath());
if (compressedFile.length() < SHARE_IMAGE_THUMB_LENGTH * 1024) {
if (compressedFile.length() < resultMaxLength * 1024) {
Source source = Okio.source(compressedFile);
BufferedSource bufferedSource = Okio.buffer(source);
byte[] bytes = bufferedSource.readByteArray();
......@@ -118,12 +94,12 @@ public class WeChatThumbnailUtil {
bufferedSource.close();
return bytes;
}
byte[] result = createScaledBitmapWithRatio(compressedFile);
if (result.length < SHARE_IMAGE_THUMB_LENGTH * 1024) {
byte[] result = createScaledBitmapWithRatio(compressedFile,scaledWidth);
if (result.length < resultMaxLength * 1024) {
return result;
}
return createScaledBitmap(compressedFile);
return createScaledBitmap(compressedFile, resultMaxLength,scaledWidth);
} catch (IOException e) {
e.printStackTrace();
......@@ -131,10 +107,10 @@ public class WeChatThumbnailUtil {
return new byte[]{};
}
private static byte[] createScaledBitmapWithRatio(File file) {
private static byte[] createScaledBitmapWithRatio(File file,int scaledWidth) {
Bitmap originBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
Bitmap result = ThumbnailCompressUtil.createScaledBitmapWithRatio(originBitmap, COMMON_THUMB_WIDTH, true);
Bitmap result = ThumbnailCompressUtil.createScaledBitmapWithRatio(originBitmap, scaledWidth, true);
String path = file.getAbsolutePath();
String suffix = path.substring(path.lastIndexOf("."), path.length());
......@@ -143,9 +119,22 @@ public class WeChatThumbnailUtil {
}
private static byte[] createScaledBitmap(File file) {
private static byte[] createScaledBitmap(File file,int resultMaxLength,int scaledWidth) {
Bitmap originBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
Bitmap result = ThumbnailCompressUtil.createScaledBitmap(originBitmap, COMMON_THUMB_WIDTH, true);
Bitmap result = null;
int width =scaledWidth;
while (width > 10){
result = ThumbnailCompressUtil.createScaledBitmap(originBitmap, width, false);
if (result.getByteCount() < resultMaxLength* 1024){
break;
}else {
width = width -10;
}
}
originBitmap.recycle();
return bmpToByteArray(result, ".png", true);
}
......@@ -179,7 +168,7 @@ public class WeChatThumbnailUtil {
return result;
}
private static File fromAssetForCommon(String thumbnail, PluginRegistry.Registrar registrar) {
private static File getAssetFile(String thumbnail, PluginRegistry.Registrar registrar) {
File result = null;
String key = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length(), thumbnail.length());
AssetFileDescriptor fileDescriptor = AssetManagerUtil.openAsset(registrar, key, getPackage(key));
......@@ -208,7 +197,6 @@ public class WeChatThumbnailUtil {
}
return packageStr;
}
private static File downloadImage(String url) {
File result = null;
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
......
......@@ -12,8 +12,6 @@ class MyApp extends StatefulWidget {
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
......@@ -26,9 +24,7 @@ class _MyAppState extends State<MyApp> {
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
}
Future<void> initPlatformState() async {}
@override
Widget build(BuildContext context) {
......@@ -41,18 +37,29 @@ class _MyAppState extends State<MyApp> {
child: new FlatButton(
onPressed: () {
var fluwx = Fluwx();
fluwx.share(WeChatShareMiniProgramModel(
webPageUrl: "http://www.qq.com",
miniProgramType:
WeChatShareMiniProgramModel.MINI_PROGRAM_TYPE_RELEASE,
userName: "gh_d43f693ca31f",
path: '/pages/media',
title: "title",
description: "des",
thumbnail:
'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534532387799&di=12701cc3f20c1a78a5c7524ec33b4c59&imgtype=0&src=http%3A%2F%2Fwww.cssxt.com%2Fuploadfile%2F2017%2F1208%2F20171208110834538.jpg',
));
// thumbnail: 'http://b.hiphotos.baidu.com/image/h%3D300/sign=4bfc640817d5ad6eb5f962eab1c939a3/8718367adab44aedb794e128bf1c8701a08bfb20.jpg',
fluwx.share(
WeChatShareWebPageModel(
webPage: "https://www.jianshu.com/",
title: "简书",
thumbnail: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534532387799&di=12701cc3f20c1a78a5c7524ec33b4c59&imgtype=0&src=http%3A%2F%2Fwww.cssxt.com%2Fuploadfile%2F2017%2F1208%2F20171208110834538.jpg',
)
).then((result){
print("--$result");
},onError: (msg){
print(msg);
});
// fluwx.share(
// WeChatShareWebPageModel(
// webPage: "https://www.jianshu.com/",
// title: "简书",
// thumbnail: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534532387799&di=12701cc3f20c1a78a5c7524ec33b4c59&imgtype=0&src=http%3A%2F%2Fwww.cssxt.com%2Fuploadfile%2F2017%2F1208%2F20171208110834538.jpg',
// )
// ).then((result){
// print("--$result");
// },onError: (msg){
// print(msg);
// });
},
child: new Text("share ")),
),
......
{
"editor.quickSuggestions": false
}
\ No newline at end of file
......@@ -95,6 +95,7 @@ class WeChatShareMiniProgramModel extends WeChatShareModel {
assert(webPageUrl != null && webPageUrl.isNotEmpty),
assert(userName != null && userName.isNotEmpty),
assert(path != null && path.isNotEmpty),
assert(miniProgramType <3 && miniProgramType > -1),
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
......@@ -280,6 +281,7 @@ class WeChatShareWebPageModel extends WeChatShareModel {
String mediaTagName,
}) : this.transaction = transaction ?? "text",
assert(webPage != null),
assert(thumbnail != null),
super(
mediaTagName: mediaTagName,
messageAction: messageAction,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论