提交 a5cc5f33 authored 作者: JarvanMo's avatar JarvanMo

share iamge & music

上级 9ed90582
...@@ -18,4 +18,6 @@ public class WechatPluginKeys { ...@@ -18,4 +18,6 @@ public class WechatPluginKeys {
public static final String IMAGE ="image"; public static final String IMAGE ="image";
public static final String THUMBNAIL ="thumbnail"; public static final String THUMBNAIL ="thumbnail";
public static final String PACKAGE = "?package=";
} }
package com.jarvanmo.wechatplugin.handler package com.jarvanmo.wechatplugin.handler
import android.util.Log
import com.jarvanmo.wechatplugin.WechatPlugin
import com.jarvanmo.wechatplugin.constant.CallResult import com.jarvanmo.wechatplugin.constant.CallResult
import com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema
import com.jarvanmo.wechatplugin.constant.WeChatPluginMethods import com.jarvanmo.wechatplugin.constant.WeChatPluginMethods
import com.jarvanmo.wechatplugin.constant.WechatPluginKeys import com.jarvanmo.wechatplugin.constant.WechatPluginKeys
import com.jarvanmo.wechatplugin.utils.AssetManagerUtil import com.jarvanmo.wechatplugin.utils.ShareImageUtil
import com.jarvanmo.wechatplugin.utils.FileUtil
import com.jarvanmo.wechatplugin.utils.WeChatThumbnailUtil import com.jarvanmo.wechatplugin.utils.WeChatThumbnailUtil
import com.tencent.mm.opensdk.modelbase.BaseResp import com.tencent.mm.opensdk.modelbase.BaseResp
import com.tencent.mm.opensdk.modelmsg.* import com.tencent.mm.opensdk.modelmsg.*
...@@ -15,7 +11,6 @@ import com.tencent.mm.opensdk.openapi.IWXAPI ...@@ -15,7 +11,6 @@ import com.tencent.mm.opensdk.openapi.IWXAPI
import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.PluginRegistry
import java.io.File
/*** /***
...@@ -106,21 +101,20 @@ object WeChatPluginHandler { ...@@ -106,21 +101,20 @@ object WeChatPluginHandler {
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 imgObj = createWxImageObject(imagePath) val byteArray = ShareImageUtil.getImageData(registrar,imagePath)
val imgObj = if(byteArray != null){
WXImageObject(byteArray)
}else{
null
}
if (imgObj == null) { if (imgObj == null) {
result.error(CallResult.RESULT_FILE_NOT_EXIST,CallResult.RESULT_FILE_NOT_EXIST,imagePath) result.error(CallResult.RESULT_FILE_NOT_EXIST,CallResult.RESULT_FILE_NOT_EXIST,imagePath)
return return
} }
// val bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img)
// val imgObj = WXImageObject(bmp)
//
val msg = WXMediaMessage() val msg = WXMediaMessage()
msg.mediaObject = imgObj msg.mediaObject = imgObj
//
// val thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true)
// bmp.recycle()
msg.thumbData = WeChatThumbnailUtil.thumbnailForCommon(call.argument(WechatPluginKeys.THUMBNAIL), registrar) msg.thumbData = WeChatThumbnailUtil.thumbnailForCommon(call.argument(WechatPluginKeys.THUMBNAIL), registrar)
// //
val req = SendMessageToWX.Req() val req = SendMessageToWX.Req()
...@@ -130,25 +124,25 @@ object WeChatPluginHandler { ...@@ -130,25 +124,25 @@ object WeChatPluginHandler {
result.success(true) result.success(true)
} }
private fun createWxImageObject(imagePath:String):WXImageObject?{ // private fun createWxImageObject(imagePath:String):WXImageObject?{
var imgObj: WXImageObject? = null // var imgObj: WXImageObject? = null
var imageFile:File? = null // var imageFile:File? = null
if (imagePath.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)){ // if (imagePath.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)){
val key = imagePath.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length, imagePath.length) // val key = imagePath.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length, imagePath.length)
val assetFileDescriptor = AssetManagerUtil.openAsset(registrar,key,"") // val assetFileDescriptor = AssetManagerUtil.openAsset(registrar,key,"")
imageFile = FileUtil.createTmpFile(assetFileDescriptor) // imageFile = FileUtil.createTmpFile(assetFileDescriptor)
}else if (imagePath.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)){ // }else if (imagePath.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)){
imageFile = File(imagePath) // imageFile = File(imagePath)
} // }
if(imageFile != null && imageFile.exists()){ // if(imageFile != null && imageFile.exists()){
imgObj = WXImageObject() // imgObj = WXImageObject()
imgObj.setImagePath(imagePath) // imgObj.setImagePath(imagePath)
}else{ // }else{
Log.d(WechatPlugin.TAG,CallResult.RESULT_FILE_NOT_EXIST) // Log.d(WechatPlugin.TAG,CallResult.RESULT_FILE_NOT_EXIST)
} // }
//
return imgObj // return imgObj
} // }
fun onResp(resp: BaseResp) { fun onResp(resp: BaseResp) {
val result = mapOf( val result = mapOf(
"errStr" to resp.errStr, "errStr" to resp.errStr,
...@@ -158,8 +152,6 @@ object WeChatPluginHandler { ...@@ -158,8 +152,6 @@ object WeChatPluginHandler {
"openId" to resp.openId "openId" to resp.openId
) )
channel?.invokeMethod(WeChatPluginMethods.WE_CHAT_RESPONSE, result) channel?.invokeMethod(WeChatPluginMethods.WE_CHAT_RESPONSE, result)
} }
......
package com.jarvanmo.wechatplugin.utils;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema;
import com.jarvanmo.wechatplugin.constant.WechatPluginKeys;
import java.io.IOException;
import java.io.InputStream;
import io.flutter.plugin.common.PluginRegistry;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class ShareImageUtil {
public static byte[] getImageData(PluginRegistry.Registrar registrar, String path) {
byte[] result = null;
if (path.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
String key = path.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length(), path.length());
AssetFileDescriptor fileDescriptor = AssetManagerUtil.openAsset(registrar, key, getPackage(key));
try {
InputStream inputStream = fileDescriptor.createInputStream();
result = streamToByteArray(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
} else if (path.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
Bitmap bmp = null;
bmp = BitmapFactory.decodeFile(path);
result = Util.bmpToByteArray(bmp, true);
} else {
InputStream inputStream = openStream(path);
if (inputStream != null) {
result = streamToByteArray(inputStream);
}
}
return result;
}
private static byte[] streamToByteArray(InputStream inputStream){
Bitmap bmp = null;
bmp = BitmapFactory.decodeStream(inputStream);
return Util.bmpToByteArray(bmp, true);
}
private static String getPackage(String assetsName) {
String packageStr = null;
if (assetsName.contains(WechatPluginKeys.PACKAGE)) {
int index = assetsName.indexOf(WechatPluginKeys.PACKAGE);
packageStr = assetsName.substring(index + WechatPluginKeys.PACKAGE.length(), assetsName.length());
}
return packageStr;
}
private static InputStream openStream(String url){
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).get().build();
try {
Response response = okHttpClient.newCall(request).execute();
ResponseBody responseBody = response.body();
if(response.isSuccessful() && responseBody!= null){
return responseBody.byteStream();
}else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
package com.jarvanmo.wechatplugin.utils; package com.jarvanmo.wechatplugin.utils;
import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.jarvanmo.wechatplugin.WechatPlugin;
import com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema; import com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema;
import com.jarvanmo.wechatplugin.constant.WechatPluginKeys;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
import java.security.Key;
import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugin.common.PluginRegistry;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Okio; import okio.Okio;
import okio.Source; import okio.Source;
...@@ -20,17 +31,20 @@ public class WeChatThumbnailUtil { ...@@ -20,17 +31,20 @@ public class WeChatThumbnailUtil {
public static byte[] thumbnailForMiniProgram(String thumbnail, PluginRegistry.Registrar registrar) { public static byte[] thumbnailForMiniProgram(String thumbnail, PluginRegistry.Registrar registrar) {
byte[] result = null; byte[] result = null;
if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) { if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
result = fromAssetForMiniProgram(thumbnail,registrar); result = fromAssetForMiniProgram(thumbnail, registrar);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
} else {
} }
return result; return result;
} }
private static byte[] fromAssetForMiniProgram(String thumbnail, PluginRegistry.Registrar registrar) {
private static byte[] fromAssetForMiniProgram(String thumbnail, PluginRegistry.Registrar registrar){
byte[] result = null; byte[] result = null;
String key = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length(), thumbnail.length()); String key = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length(), thumbnail.length());
AssetFileDescriptor fileDescriptor = AssetManagerUtil.openAsset(registrar, key, ""); AssetFileDescriptor fileDescriptor = AssetManagerUtil.openAsset(registrar, key, getPackage(key));
if (fileDescriptor != null && fileDescriptor.getLength() <= 128 * 1024) { if (fileDescriptor != null && fileDescriptor.getLength() <= 128 * 1024) {
try { try {
...@@ -61,19 +75,32 @@ public class WeChatThumbnailUtil { ...@@ -61,19 +75,32 @@ public class WeChatThumbnailUtil {
return result; return result;
} }
public static byte[] thumbnailForCommon(String thumbnail, PluginRegistry.Registrar registrar){ public static byte[] thumbnailForCommon(String thumbnail, PluginRegistry.Registrar registrar) {
byte[] result = null; byte[] result = null;
if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) { if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)) {
result = fromAssetForCommon(thumbnail,registrar); result = fromAssetForCommon(thumbnail, registrar);
} else if (thumbnail.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)) {
Bitmap bmp = BitmapFactory.decodeFile(thumbnail);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, COMMON_THUMB_SIZE, COMMON_THUMB_SIZE, true);
bmp.recycle();
result = Util.bmpToByteArray(thumbBmp, true);
} else {
InputStream input = openStream(thumbnail);
if (input != null) {
Bitmap bmp = BitmapFactory.decodeStream(input);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, COMMON_THUMB_SIZE, COMMON_THUMB_SIZE, true);
bmp.recycle();
result = Util.bmpToByteArray(thumbBmp, true);
}
} }
return result; return result;
} }
private static byte[] fromAssetForCommon(String thumbnail, PluginRegistry.Registrar registrar){ private static byte[] fromAssetForCommon(String thumbnail, PluginRegistry.Registrar registrar) {
int size = 32; int size = 32;
byte[] result = null; byte[] result = null;
String key = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length(), thumbnail.length()); String key = thumbnail.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length(), thumbnail.length());
AssetFileDescriptor fileDescriptor = AssetManagerUtil.openAsset(registrar, key, ""); AssetFileDescriptor fileDescriptor = AssetManagerUtil.openAsset(registrar, key, getPackage(key));
if (fileDescriptor != null && fileDescriptor.getLength() <= size * 1024) { if (fileDescriptor != null && fileDescriptor.getLength() <= size * 1024) {
try { try {
...@@ -107,4 +134,32 @@ public class WeChatThumbnailUtil { ...@@ -107,4 +134,32 @@ public class WeChatThumbnailUtil {
// result = Util.bmpToByteArray(thumbBmp, true); // result = Util.bmpToByteArray(thumbBmp, true);
return result; return result;
} }
private static String getPackage(String assetsName) {
String packageStr = null;
if (assetsName.contains(WechatPluginKeys.PACKAGE)) {
int index = assetsName.indexOf(WechatPluginKeys.PACKAGE);
packageStr = assetsName.substring(index + WechatPluginKeys.PACKAGE.length(), assetsName.length());
}
return packageStr;
}
private static InputStream openStream(String url){
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).get().build();
try {
Response response = okHttpClient.newCall(request).execute();
ResponseBody responseBody = response.body();
if(response.isSuccessful() && responseBody!= null){
return responseBody.byteStream();
}else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
} }
...@@ -3,6 +3,9 @@ import 'package:wechat_plugin/src/wechat_scene.dart'; ...@@ -3,6 +3,9 @@ import 'package:wechat_plugin/src/wechat_scene.dart';
const String _scene = "scene"; const String _scene = "scene";
const String _transaction = "transaction"; const String _transaction = "transaction";
const String _thumbnail = "thumbnail"; const String _thumbnail = "thumbnail";
const String _title = "title";
const String _description ="description";
class WeChatShareTextModel { class WeChatShareTextModel {
final String text; final String text;
...@@ -80,8 +83,7 @@ class WeChatShareImageModel { ...@@ -80,8 +83,7 @@ class WeChatShareImageModel {
: this.transaction = transaction ?? "text", : this.transaction = transaction ?? "text",
this.scene = scene ?? WeChatScene.TIMELINE, this.scene = scene ?? WeChatScene.TIMELINE,
this.thumbnail = thumbnail ?? "", this.thumbnail = thumbnail ?? "",
assert(image != null), assert(image != null);
assert(thumbnail != null);
Map toMap() { Map toMap() {
return { return {
...@@ -92,3 +94,40 @@ class WeChatShareImageModel { ...@@ -92,3 +94,40 @@ class WeChatShareImageModel {
}; };
} }
} }
class WeChatShareMusicModel {
final String transaction;
final WeChatScene scene;
final String musicUrl;
final String musicLowBandUrl;
final String thumbnail;
final String title;
final String description;
WeChatShareMusicModel(
{String transaction,
WeChatScene scene,
this.musicUrl,
this.musicLowBandUrl ,
this.title:"",
this.description:"",
String thumbnail})
: this.transaction = transaction ?? "text",
this.scene = scene ?? WeChatScene.TIMELINE,
this.thumbnail = thumbnail ?? "",
assert(musicUrl != null || musicLowBandUrl != null ),
assert(thumbnail != null);
Map toMap() {
return {
_transaction: transaction,
_scene: scene.toString(),
"musicUrl": musicUrl,
"musicLowBandUrl":musicLowBandUrl,
_thumbnail: thumbnail,
_title:title,
_description:description
};
}
}
...@@ -36,6 +36,11 @@ class WechatPlugin { ...@@ -36,6 +36,11 @@ class WechatPlugin {
} }
static Future shareMusic(WeChatShareMusicModel model)async{
return await _channel.invokeMethod("shareMusic",model.toMap());
}
static Future<dynamic> _handler(MethodCall methodCall){ static Future<dynamic> _handler(MethodCall methodCall){
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论