Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx-fluwx
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
openSourceLibrary
clx-fluwx
Commits
f84f12bc
提交
f84f12bc
authored
8月 16, 2018
作者:
JarvanMo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
android part
上级
f09621e6
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
347 行增加
和
63 行删除
+347
-63
WeChatPluginHandler.kt
...in/kotlin/com/jarvan/fluwx/handler/WeChatPluginHandler.kt
+17
-15
ShareImageUtil.java
...rc/main/kotlin/com/jarvan/fluwx/utils/ShareImageUtil.java
+1
-0
ThumbnailCompressUtil.java
.../kotlin/com/jarvan/fluwx/utils/ThumbnailCompressUtil.java
+158
-0
Util.java
android/src/main/kotlin/com/jarvan/fluwx/utils/Util.java
+7
-2
WeChatThumbnailUtil.java
...in/kotlin/com/jarvan/fluwx/utils/WeChatThumbnailUtil.java
+107
-45
main.dart
example/lib/main.dart
+9
-1
FluwxShareHandler.m
ios/Classes/handler/FluwxShareHandler.m
+43
-0
wechat_share_models.dart
lib/src/models/wechat_share_models.dart
+5
-0
没有找到文件。
android/src/main/kotlin/com/jarvan/fluwx/handler/WeChatPluginHandler.kt
浏览文件 @
f84f12bc
package
com.jarvan.fluwx.handler
package
com.jarvan.fluwx.handler
import
android.graphics.Bitmap
import
android.graphics.BitmapFactory
import
android.graphics.BitmapFactory
import
android.util.Log
import
android.util.Log
import
com.jarvan.fluwx.R
import
com.jarvan.fluwx.R
...
@@ -9,7 +8,6 @@ import com.jarvan.fluwx.constant.CallResult
...
@@ -9,7 +8,6 @@ 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.Util
import
com.jarvan.fluwx.utils.WeChatThumbnailUtil
import
com.jarvan.fluwx.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.*
...
@@ -17,9 +15,6 @@ import com.tencent.mm.opensdk.openapi.IWXAPI
...
@@ -17,9 +15,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
com.tencent.mm.opensdk.modelmsg.SendMessageToWX
import
com.tencent.mm.opensdk.modelmsg.WXMediaMessage
import
com.tencent.mm.opensdk.modelmsg.WXMusicObject
import
kotlinx.coroutines.experimental.CommonPool
import
kotlinx.coroutines.experimental.CommonPool
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.async
import
kotlinx.coroutines.experimental.async
...
@@ -122,18 +117,15 @@ object WeChatPluginHandler {
...
@@ -122,18 +117,15 @@ object WeChatPluginHandler {
private
suspend
fun
getImageByteArrayCommon
(
registrar
:
PluginRegistry
.
Registrar
?,
imagePath
:
String
):
ByteArray
{
private
suspend
fun
getImageByteArrayCommon
(
registrar
:
PluginRegistry
.
Registrar
?,
imagePath
:
String
):
ByteArray
{
return
async
(
CommonPool
){
return
async
(
CommonPool
){
val
r
=
ShareImageUtil
.
getImageData
(
registrar
,
imagePath
)
val
result
=
ShareImageUtil
.
getImageData
(
registrar
,
imagePath
)
if
(
r
==
null
)
{
result
?:
byteArrayOf
()
byteArrayOf
()
}
else
{
r
}
}.
await
()
}.
await
()
}
}
private
suspend
fun
getThumbnailByteArrayCommon
(
registrar
:
PluginRegistry
.
Registrar
?,
thumbnail
:
String
):
ByteArray
{
private
suspend
fun
getThumbnailByteArrayCommon
(
registrar
:
PluginRegistry
.
Registrar
?,
thumbnail
:
String
):
ByteArray
{
return
async
(
CommonPool
){
return
async
(
CommonPool
){
WeChatThumbnailUtil
.
thumbnailForCommon
(
thumbnail
,
registrar
)
val
result
=
WeChatThumbnailUtil
.
thumbnailForCommon
(
thumbnail
,
registrar
)
result
?:
byteArrayOf
()
}.
await
()
}.
await
()
}
}
private
fun
shareImage
(
call
:
MethodCall
,
result
:
MethodChannel
.
Result
)
{
private
fun
shareImage
(
call
:
MethodCall
,
result
:
MethodChannel
.
Result
)
{
...
@@ -155,12 +147,16 @@ object WeChatPluginHandler {
...
@@ -155,12 +147,16 @@ object WeChatPluginHandler {
}
}
var
thumbnail
:
String
?
=
call
.
argument
(
WechatPluginKeys
.
THUMBNAIL
)
var
thumbnail
:
String
?
=
call
.
argument
(
WechatPluginKeys
.
THUMBNAIL
)
if
(
thumbnail
.
isNullOrBlank
()){
if
(
thumbnail
.
isNullOrBlank
()){
thumbnail
=
imagePath
thumbnail
=
imagePath
}
}
Log
.
e
(
"tag"
,
"$thumbnail"
)
val
thumbnailData
=
getThumbnailByteArrayCommon
(
registrar
,
thumbnail
!!
)
val
bitmap
=
BitmapFactory
.
decodeResource
(
registrar
!!
.
context
().
resources
,
R
.
mipmap
.
ic_launcher
)
val
thumbnailData
=
Util
.
bmpToByteArray
(
bitmap
,
true
)
//
val thumbnailData = Util.bmpToByteArray(bitmap,true)
handleShareImage
(
imgObj
,
call
,
thumbnailData
,
result
)
handleShareImage
(
imgObj
,
call
,
thumbnailData
,
result
)
}
}
...
@@ -170,8 +166,12 @@ object WeChatPluginHandler {
...
@@ -170,8 +166,12 @@ object WeChatPluginHandler {
val
msg
=
WXMediaMessage
()
val
msg
=
WXMediaMessage
()
msg
.
mediaObject
=
imgObj
msg
.
mediaObject
=
imgObj
if
(
thumbnailData
==
null
||
thumbnailData
.
isEmpty
()){
msg
.
thumbData
=
null
}
else
{
msg
.
thumbData
=
thumbnailData
}
msg
.
thumbData
=
thumbnailData
msg
.
title
=
call
.
argument
<
String
>(
WechatPluginKeys
.
TITLE
)
msg
.
title
=
call
.
argument
<
String
>(
WechatPluginKeys
.
TITLE
)
msg
.
description
=
call
.
argument
<
String
>(
WechatPluginKeys
.
DESCRIPTION
)
msg
.
description
=
call
.
argument
<
String
>(
WechatPluginKeys
.
DESCRIPTION
)
...
@@ -187,8 +187,10 @@ object WeChatPluginHandler {
...
@@ -187,8 +187,10 @@ object WeChatPluginHandler {
val
musicLowBandUrl
:
String
?
=
call
.
argument
(
"musicLowBandUrl"
)
val
musicLowBandUrl
:
String
?
=
call
.
argument
(
"musicLowBandUrl"
)
if
(
musicUrl
!=
null
)
{
if
(
musicUrl
!=
null
)
{
music
.
musicUrl
=
musicUrl
music
.
musicUrl
=
musicUrl
music
.
musicDataUrl
=
call
.
argument
(
"musicDataUrl"
)
}
else
{
}
else
{
music
.
musicLowBandUrl
=
musicLowBandUrl
music
.
musicLowBandUrl
=
musicLowBandUrl
music
.
musicLowBandDataUrl
=
call
.
argument
(
"musicLowBandDataUrl"
)
}
}
val
msg
=
WXMediaMessage
()
val
msg
=
WXMediaMessage
()
msg
.
mediaObject
=
music
msg
.
mediaObject
=
music
...
...
android/src/main/kotlin/com/jarvan/fluwx/utils/ShareImageUtil.java
浏览文件 @
f84f12bc
...
@@ -113,6 +113,7 @@ public class ShareImageUtil {
...
@@ -113,6 +113,7 @@ public class ShareImageUtil {
sink
=
Okio
.
buffer
(
Okio
.
sink
(
outputStream
));
sink
=
Okio
.
buffer
(
Okio
.
sink
(
outputStream
));
source
=
Okio
.
source
(
inputStream
);
source
=
Okio
.
source
(
inputStream
);
sink
.
writeAll
(
source
);
sink
.
writeAll
(
source
);
sink
.
flush
();
}
catch
(
IOException
e
)
{
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
}
finally
{
}
finally
{
...
...
android/src/main/kotlin/com/jarvan/fluwx/utils/ThumbnailCompressUtil.java
0 → 100644
浏览文件 @
f84f12bc
package
com
.
jarvan
.
fluwx
.
utils
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.os.Build
;
import
android.util.Log
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
public
class
ThumbnailCompressUtil
{
/*** 图片压缩比例计算**
* @param options BitmapFactory.Options* @param minSideLength 小边长,单位为像素,如果为-1,则不按照边来压缩图片*
* @param maxNumOfPixels 这张片图片最大像素值,单位为byte,如100*1024* @return 压缩比例,必须为2的次幂*/
public
static
int
computeSampleSize
(
BitmapFactory
.
Options
options
,
int
minSideLength
,
int
maxNumOfPixels
)
{
int
initialSize
=
computeInitialSampleSize
(
options
,
minSideLength
,
maxNumOfPixels
);
int
roundedSize
;
if
(
initialSize
<=
8
)
{
roundedSize
=
1
;
while
(
roundedSize
<
initialSize
)
{
roundedSize
<<=
1
;
}
}
else
{
roundedSize
=
(
initialSize
+
7
)
/
8
*
8
;
}
return
roundedSize
;
}
/*** 计算图片的压缩比例,用于图片压缩
* * @param options BitmapFactory.Options* @param minSideLength 小边长,单位为像素,如果为-1,则不按照边来压缩图片
* * @param maxNumOfPixels 这张片图片最大像素值,单位为byte,如100*1024*
* @return 压缩比例*/
private
static
int
computeInitialSampleSize
(
BitmapFactory
.
Options
options
,
int
minSideLength
,
int
maxNumOfPixels
)
{
double
w
=
options
.
outWidth
;
double
h
=
options
.
outHeight
;
int
lowerBound
=
(
maxNumOfPixels
==
-
1
)
?
1
:
(
int
)
Math
.
ceil
(
Math
.
sqrt
(
w
*
h
/
maxNumOfPixels
));
int
upperBound
=
(
minSideLength
==
-
1
)
?
128
:
(
int
)
Math
.
min
(
Math
.
floor
(
w
/
minSideLength
),
Math
.
floor
(
h
/
minSideLength
));
if
(
upperBound
<
lowerBound
)
{
return
lowerBound
;
}
if
((
maxNumOfPixels
==
-
1
)
&&
(
minSideLength
==
-
1
))
{
return
1
;
}
else
if
(
minSideLength
==
-
1
)
{
return
lowerBound
;
}
else
{
return
upperBound
;
}
}
public
static
Bitmap
makeNormalBitmap
(
String
nativeImagePath
,
int
minSideLength
,
int
maxNumOfPixels
)
{
return
makeNormalBitmap
(
nativeImagePath
,
minSideLength
,
maxNumOfPixels
,
Bitmap
.
Config
.
ARGB_4444
);
}
public
static
Bitmap
makeNormalBitmap
(
String
nativeImagePath
,
int
minSideLength
,
int
maxNumOfPixels
,
Bitmap
.
Config
config
)
{
Bitmap
.
CompressFormat
format
=
Bitmap
.
CompressFormat
.
JPEG
;
if
(
nativeImagePath
.
toLowerCase
().
endsWith
(
".png"
))
{
format
=
Bitmap
.
CompressFormat
.
PNG
;
}
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Bitmap bitmap = BitmapFactory.decodeFile(nativeImagePath);
// BitmapFactory.Options options = new BitmapFactory.Options();
// options.inPreferredConfig = config;
// options.outHeight = bitmap.getHeight();
// options.outWidth = bitmap.getWidth();
// int quality = computeSampleSize(options, minSideLength, maxNumOfPixels);
// bitmap.compress(format, quality, baos);
//
// byte[] bytes = baos.toByteArray();
// bitmap.recycle();
// Bitmap result = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);
// try {
// baos.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
Bitmap
bitmap
=
BitmapFactory
.
decodeFile
(
nativeImagePath
);
bitmap
.
compress
(
Bitmap
.
CompressFormat
.
JPEG
,
100
,
baos
);
int
options
=
100
;
//此处可尝试用90%开始压缩,跳过100%压缩
// 循环判断如果压缩后图片是否大于100kb,大于继续压缩
int
length
;
while
((
length
=
baos
.
toByteArray
().
length
)
/
1024
>
32
)
{
// 每次都减少10
options
-=
10
;
// 重置baos即清空baos
baos
.
reset
();
// 这里压缩options%,把压缩后的数据存放到baos中
if
(
options
<=
0
){
options
=
0
;
}
bitmap
.
compress
(
Bitmap
.
CompressFormat
.
JPEG
,
options
,
baos
);
if
(
options
==
0
){
break
;
}
}
return
bitmap
;
}
public
static
Bitmap
compress
(
String
nativeImagePath
){
Bitmap
.
CompressFormat
format
=
Bitmap
.
CompressFormat
.
JPEG
;
if
(
nativeImagePath
.
toLowerCase
().
endsWith
(
".png"
))
{
format
=
Bitmap
.
CompressFormat
.
PNG
;
}
Log
.
e
(
"tag"
,
nativeImagePath
);
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
Bitmap
bitmap
=
BitmapFactory
.
decodeFile
(
nativeImagePath
);
bitmap
.
compress
(
format
,
90
,
baos
);
byte
[]
bytes
=
baos
.
toByteArray
();
bitmap
.
recycle
();
Bitmap
result
=
BitmapFactory
.
decodeByteArray
(
bytes
,
0
,
bytes
.
length
,
null
);
try
{
baos
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
result
;
}
public
static
Bitmap
createScaledBitmapWithRatio
(
Bitmap
bitmap
,
float
thumbWidth
,
boolean
recycle
)
{
Bitmap
thumb
;
int
imagw
=
bitmap
.
getWidth
();
int
imagh
=
bitmap
.
getHeight
();
if
(
imagh
>
imagw
)
{
int
height
=
(
int
)
(
imagh
*
thumbWidth
/
imagw
);
thumb
=
Bitmap
.
createScaledBitmap
(
bitmap
,
(
int
)
thumbWidth
,
height
,
true
);
}
else
{
int
width
=
(
int
)
(
imagw
*
thumbWidth
/
imagh
);
thumb
=
Bitmap
.
createScaledBitmap
(
bitmap
,
width
,
(
int
)
thumbWidth
,
true
);
}
if
(
recycle
)
{
bitmap
.
recycle
();
}
return
thumb
;
}
public
static
Bitmap
createScaledBitmap
(
Bitmap
bitmap
,
int
size
,
boolean
recycle
)
{
Bitmap
thumb
;
thumb
=
Bitmap
.
createScaledBitmap
(
bitmap
,
size
,
size
,
true
);
if
(
recycle
)
{
bitmap
.
recycle
();
}
return
thumb
;
}
}
android/src/main/kotlin/com/jarvan/fluwx/utils/Util.java
浏览文件 @
f84f12bc
...
@@ -18,13 +18,17 @@ import android.graphics.BitmapFactory;
...
@@ -18,13 +18,17 @@ import android.graphics.BitmapFactory;
import
android.graphics.Bitmap.CompressFormat
;
import
android.graphics.Bitmap.CompressFormat
;
import
android.util.Log
;
import
android.util.Log
;
public
class
Util
{
class
Util
{
private
static
final
String
TAG
=
"SDK_Sample.Util"
;
private
static
final
String
TAG
=
"SDK_Sample.Util"
;
public
static
byte
[]
bmpToByteArray
(
final
Bitmap
bmp
,
final
boolean
needRecycle
)
{
public
static
byte
[]
bmpToByteArray
(
final
Bitmap
bmp
,
final
boolean
needRecycle
)
{
return
bmpToByteArray
(
bmp
,
CompressFormat
.
PNG
,
needRecycle
);
}
public
static
byte
[]
bmpToByteArray
(
final
Bitmap
bmp
,
CompressFormat
format
,
final
boolean
needRecycle
)
{
ByteArrayOutputStream
output
=
new
ByteArrayOutputStream
();
ByteArrayOutputStream
output
=
new
ByteArrayOutputStream
();
bmp
.
compress
(
CompressFormat
.
PNG
,
100
,
output
);
bmp
.
compress
(
format
,
100
,
output
);
if
(
needRecycle
)
{
if
(
needRecycle
)
{
bmp
.
recycle
();
bmp
.
recycle
();
}
}
...
@@ -39,6 +43,7 @@ public class Util {
...
@@ -39,6 +43,7 @@ public class Util {
return
result
;
return
result
;
}
}
public
static
byte
[]
getHtmlByteArray
(
final
String
url
)
{
public
static
byte
[]
getHtmlByteArray
(
final
String
url
)
{
URL
htmlUrl
=
null
;
URL
htmlUrl
=
null
;
InputStream
inStream
=
null
;
InputStream
inStream
=
null
;
...
...
android/src/main/kotlin/com/jarvan/fluwx/utils/WeChatThumbnailUtil.java
浏览文件 @
f84f12bc
...
@@ -3,25 +3,34 @@ package com.jarvan.fluwx.utils;
...
@@ -3,25 +3,34 @@ package com.jarvan.fluwx.utils;
import
android.content.res.AssetFileDescriptor
;
import
android.content.res.AssetFileDescriptor
;
import
android.graphics.Bitmap
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.graphics.BitmapFactory
;
import
android.util.Log
;
import
com.jarvan.fluwx.constant.WeChatPluginImageSchema
;
import
com.jarvan.fluwx.constant.WeChatPluginImageSchema
;
import
com.jarvan.fluwx.constant.WechatPluginKeys
;
import
com.jarvan.fluwx.constant.WechatPluginKeys
;
import
java.io.File
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.nio.ByteBuffer
;
import
java.util.UUID
;
import
io.flutter.plugin.common.PluginRegistry
;
import
io.flutter.plugin.common.PluginRegistry
;
import
okhttp3.OkHttpClient
;
import
okhttp3.OkHttpClient
;
import
okhttp3.Request
;
import
okhttp3.Request
;
import
okhttp3.Response
;
import
okhttp3.Response
;
import
okhttp3.ResponseBody
;
import
okhttp3.ResponseBody
;
import
okio.BufferedSink
;
import
okio.Okio
;
import
okio.Okio
;
import
okio.Source
;
import
okio.Source
;
import
top.zibin.luban.Luban
;
public
class
WeChatThumbnailUtil
{
public
class
WeChatThumbnailUtil
{
private
static
final
int
COMMON_THUMB_SIZE
=
150
;
public
static
final
int
SHARE_IMAGE_THUMB_LENGTH
=
32
;
private
static
final
int
COMMON_THUMB_WIDTH
=
150
;
private
WeChatThumbnailUtil
()
{
private
WeChatThumbnailUtil
()
{
}
}
...
@@ -74,62 +83,99 @@ public class WeChatThumbnailUtil {
...
@@ -74,62 +83,99 @@ public class WeChatThumbnailUtil {
}
}
public
static
byte
[]
thumbnailForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
public
static
byte
[]
thumbnailForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
byte
[]
result
=
null
;
File
file
;
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
))
{
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
))
{
result
=
fromAssetForCommon
(
thumbnail
,
registrar
);
file
=
fromAssetForCommon
(
thumbnail
,
registrar
);
}
else
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_FILE
))
{
}
else
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_FILE
))
{
Bitmap
bmp
=
BitmapFactory
.
decodeFile
(
thumbnail
);
file
=
new
File
(
thumbnail
);
Bitmap
thumbBmp
=
Bitmap
.
createScaledBitmap
(
bmp
,
COMMON_THUMB_SIZE
,
COMMON_THUMB_SIZE
,
true
);
bmp
.
recycle
();
result
=
Util
.
bmpToByteArray
(
thumbBmp
,
true
);
}
else
{
}
else
{
InputStream
input
=
openStream
(
thumbnail
);
file
=
downloadImage
(
thumbnail
);
if
(
input
!=
null
)
{
}
Bitmap
bmp
=
BitmapFactory
.
decodeStream
(
input
);
return
compress
(
file
,
registrar
);
Bitmap
thumbBmp
=
Bitmap
.
createScaledBitmap
(
bmp
,
COMMON_THUMB_SIZE
,
COMMON_THUMB_SIZE
,
true
);
}
bmp
.
recycle
();
result
=
Util
.
bmpToByteArray
(
thumbBmp
,
true
);
private
static
byte
[]
compress
(
File
file
,
PluginRegistry
.
Registrar
registrar
)
{
if
(
file
==
null
)
{
return
new
byte
[]{};
}
int
size
=
SHARE_IMAGE_THUMB_LENGTH
*
1024
;
try
{
File
file1
=
Luban
.
with
(
registrar
.
context
())
.
setTargetDir
(
registrar
.
context
().
getCacheDir
().
getAbsolutePath
())
.
ignoreBy
(
32
)
.
get
(
file
.
getAbsolutePath
());
if
(
file
.
length
()
<=
32
*
1024
){
return
Util
.
bmpToByteArray
(
BitmapFactory
.
decodeFile
(
file1
.
getAbsolutePath
()),
true
);
}
else
{
return
continueCompress
(
file1
);
}
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
return
result
;
return
new
byte
[]{}
;
}
}
private
static
byte
[]
fromAssetForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
private
static
byte
[]
continueCompress
(
File
file
){
int
size
=
32
;
// Bitmap bitmap = ThumbnailCompressUtil.makeNormalBitmap(file.getAbsolutePath(), -1, 32 * 1024);
byte
[]
result
=
null
;
// if (bitmap.getByteCount() <= size) {
// return bmpToByteArray(bitmap,true);
// }
//
//
// byte[] result = Util.bmpToByteArray(bitmap, true);
// if (result.length <= size) {
// return result;
// }
//
Bitmap
bitmap
=
BitmapFactory
.
decodeFile
(
file
.
getAbsolutePath
());
Bitmap
bitmap2
=
ThumbnailCompressUtil
.
createScaledBitmapWithRatio
(
bitmap
,
COMMON_THUMB_WIDTH
,
false
);
Util
.
getHtmlByteArray
()
if
(
bitmap2
.
getByteCount
()
<=
32
*
1024
){
return
bmpToByteArray
(
bitmap2
,
true
);
}
bitmap
=
ThumbnailCompressUtil
.
createScaledBitmap
(
bitmap
,
COMMON_THUMB_WIDTH
,
true
);
return
bmpToByteArray
(
bitmap
,
true
);
}
private
static
byte
[]
bmpToByteArray
(
Bitmap
bitmap
,
boolean
recycle
)
{
int
bytes
=
bitmap
.
getByteCount
();
ByteBuffer
buf
=
ByteBuffer
.
allocate
(
bytes
);
bitmap
.
copyPixelsToBuffer
(
buf
);
if
(
recycle
)
{
bitmap
.
recycle
();
}
return
buf
.
array
();
}
private
static
File
fromAssetForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
File
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
,
getPackage
(
key
));
AssetFileDescriptor
fileDescriptor
=
AssetManagerUtil
.
openAsset
(
registrar
,
key
,
getPackage
(
key
));
if
(
fileDescriptor
!=
null
&&
fileDescriptor
.
getLength
()
<=
size
*
1024
)
{
if
(
fileDescriptor
!=
null
)
{
try
{
try
{
result
=
File
.
createTempFile
(
UUID
.
randomUUID
().
toString
(),
getSuffix
(
key
));
OutputStream
outputStream
=
new
FileOutputStream
(
result
);
BufferedSink
sink
=
Okio
.
buffer
(
Okio
.
sink
(
outputStream
));
Source
source
=
Okio
.
source
(
fileDescriptor
.
createInputStream
());
Source
source
=
Okio
.
source
(
fileDescriptor
.
createInputStream
());
result
=
Okio
.
buffer
(
source
).
readByteArray
();
sink
.
writeAll
(
source
);
source
.
close
();
sink
.
flush
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
else
if
(
fileDescriptor
!=
null
&&
fileDescriptor
.
getLength
()
>
size
*
1024
)
{
File
file
=
FileUtil
.
createTmpFile
(
fileDescriptor
);
if
(
file
==
null
)
{
return
null
;
}
File
snapshot
=
CompressImageUtil
.
compressUtilSmallerThan
(
size
,
file
,
registrar
.
context
());
if
(
snapshot
==
null
)
{
return
null
;
}
try
{
source
.
close
();
result
=
Okio
.
buffer
(
Okio
.
source
(
snapshot
)).
readByteArray
();
sink
.
close
();
}
catch
(
IOException
e
)
{
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
}
}
// Bitmap bmp = BitmapFactory.decodeStream(new URL(url).openStream());
// Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, COMMON_THUMB_SIZE, COMMON_THUMB_SIZE, true);
// bmp.recycle();
// result = Util.bmpToByteArray(thumbBmp, true);
return
result
;
return
result
;
}
}
...
@@ -142,22 +188,38 @@ public class WeChatThumbnailUtil {
...
@@ -142,22 +188,38 @@ public class WeChatThumbnailUtil {
return
packageStr
;
return
packageStr
;
}
}
private
static
InputStream
openStream
(
String
url
)
{
private
static
File
downloadImage
(
String
url
)
{
File
result
=
null
;
OkHttpClient
okHttpClient
=
new
OkHttpClient
.
Builder
().
build
();
OkHttpClient
okHttpClient
=
new
OkHttpClient
.
Builder
().
build
();
Request
request
=
new
Request
.
Builder
().
url
(
url
).
get
().
build
();
Request
request
=
new
Request
.
Builder
().
url
(
url
).
get
().
build
();
try
{
try
{
Response
response
=
okHttpClient
.
newCall
(
request
).
execute
();
Response
response
=
okHttpClient
.
newCall
(
request
).
execute
();
ResponseBody
responseBody
=
response
.
body
();
ResponseBody
responseBody
=
response
.
body
();
if
(
response
.
isSuccessful
()
&&
responseBody
!=
null
)
{
if
(
response
.
isSuccessful
()
&&
responseBody
!=
null
)
{
return
responseBody
.
byteStream
();
result
=
File
.
createTempFile
(
UUID
.
randomUUID
().
toString
(),
getSuffix
(
url
));
}
else
{
OutputStream
outputStream
=
new
FileOutputStream
(
result
);
return
null
;
BufferedSink
sink
=
Okio
.
buffer
(
Okio
.
sink
(
outputStream
));
Source
source
=
Okio
.
source
(
responseBody
.
byteStream
());
sink
.
writeAll
(
source
);
sink
.
flush
();
source
.
close
();
sink
.
close
();
}
}
}
catch
(
IOException
e
)
{
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
return
null
;
}
}
return
result
;
}
private
static
String
getSuffix
(
String
path
)
{
String
suffix
=
".jpg"
;
int
index
=
path
.
lastIndexOf
(
"."
);
if
(
index
>
0
)
{
suffix
=
path
.
substring
(
index
,
path
.
length
());
}
return
suffix
;
}
}
}
}
example/lib/main.dart
浏览文件 @
f84f12bc
...
@@ -13,6 +13,7 @@ class MyApp extends StatefulWidget {
...
@@ -13,6 +13,7 @@ class MyApp extends StatefulWidget {
class
_MyAppState
extends
State
<
MyApp
>
{
class
_MyAppState
extends
State
<
MyApp
>
{
String
_platformVersion
=
'Unknown'
;
String
_platformVersion
=
'Unknown'
;
@override
@override
void
initState
()
{
void
initState
()
{
super
.
initState
();
super
.
initState
();
...
@@ -55,7 +56,14 @@ class _MyAppState extends State<MyApp> {
...
@@ -55,7 +56,14 @@ class _MyAppState extends State<MyApp> {
child:
new
FlatButton
(
child:
new
FlatButton
(
onPressed:
()
{
onPressed:
()
{
var
fluwx
=
Fluwx
();
var
fluwx
=
Fluwx
();
fluwx
.
share
(
WeChatShareTextModel
(
text:
"hehe"
));
// thumbnail: 'http://b.hiphotos.baidu.com/image/h%3D300/sign=4bfc640817d5ad6eb5f962eab1c939a3/8718367adab44aedb794e128bf1c8701a08bfb20.jpg',
fluwx
.
share
(
WeChatShareImageModel
(
image:
'http://a.hiphotos.baidu.com/image/h%3D300/sign=91a426229082d158a4825fb1b00819d5/0824ab18972bd4077557733177899e510eb3096d.jpg'
,
thumbnail:
'http://a.hiphotos.baidu.com/image/h%3D300/sign=91a426229082d158a4825fb1b00819d5/0824ab18972bd4077557733177899e510eb3096d.jpg'
,
transaction:
'http://b.hiphotos.baidu.com/image/h%3D300/sign=4bfc640817d5ad6eb5f962eab1c939a3/8718367adab44aedb794e128bf1c8701a08bfb20.jpg'
,
scene:
WeChatScene
.
SESSION
));
},
},
child:
new
Text
(
"share text to wechat"
)),
child:
new
Text
(
"share text to wechat"
)),
),
),
...
...
ios/Classes/handler/FluwxShareHandler.m
浏览文件 @
f84f12bc
...
@@ -142,4 +142,46 @@ NSObject <FlutterPluginRegistrar> *_registrar;
...
@@ -142,4 +142,46 @@ NSObject <FlutterPluginRegistrar> *_registrar;
BOOL
done
=
[
WXApiRequestHandler
sendText
:
text
InScene
:[
StringToWeChatScene
toScene
:
scene
]];
BOOL
done
=
[
WXApiRequestHandler
sendText
:
text
InScene
:[
StringToWeChatScene
toScene
:
scene
]];
result
(
@
(
done
));
result
(
@
(
done
));
}
}
+
(
UIImage
*
)
compressImage
:(
UIImage
*
)
image
toByte
:(
NSUInteger
)
maxLength
{
// Compress by quality
CGFloat
compression
=
1
;
NSData
*
data
=
UIImageJPEGRepresentation
(
image
,
compression
);
if
(
data
.
length
<
maxLength
)
return
image
;
CGFloat
max
=
1
;
CGFloat
min
=
0
;
for
(
int
i
=
0
;
i
<
6
;
++
i
)
{
compression
=
(
max
+
min
)
/
2
;
data
=
UIImageJPEGRepresentation
(
image
,
compression
);
if
(
data
.
length
<
maxLength
*
0
.
9
)
{
min
=
compression
;
}
else
if
(
data
.
length
>
maxLength
)
{
max
=
compression
;
}
else
{
break
;
}
}
UIImage
*
resultImage
=
[
UIImage
imageWithData
:
data
];
if
(
data
.
length
<
maxLength
)
return
resultImage
;
// Compress by size
NSUInteger
lastDataLength
=
0
;
while
(
data
.
length
>
maxLength
&&
data
.
length
!=
lastDataLength
)
{
lastDataLength
=
data
.
length
;
CGFloat
ratio
=
(
CGFloat
)
maxLength
/
data
.
length
;
CGSize
size
=
CGSizeMake
((
NSUInteger
)(
resultImage
.
size
.
width
*
sqrtf
(
ratio
)),
(
NSUInteger
)(
resultImage
.
size
.
height
*
sqrtf
(
ratio
)));
// Use NSUInteger to prevent white blank
UIGraphicsBeginImageContext
(
size
);
[
resultImage
drawInRect
:
CGRectMake
(
0
,
0
,
size
.
width
,
size
.
height
)];
resultImage
=
UIGraphicsGetImageFromCurrentImageContext
();
UIGraphicsEndImageContext
();
data
=
UIImageJPEGRepresentation
(
resultImage
,
compression
);
}
return
resultImage
;
}
@end
@end
\ No newline at end of file
lib/src/models/wechat_share_models.dart
浏览文件 @
f84f12bc
...
@@ -162,7 +162,9 @@ class WeChatShareImageModel extends WeChatShareModel {
...
@@ -162,7 +162,9 @@ class WeChatShareImageModel extends WeChatShareModel {
class
WeChatShareMusicModel
extends
WeChatShareModel
{
class
WeChatShareMusicModel
extends
WeChatShareModel
{
final
String
transaction
;
final
String
transaction
;
final
String
musicUrl
;
final
String
musicUrl
;
final
String
musicDataUrl
;
final
String
musicLowBandUrl
;
final
String
musicLowBandUrl
;
final
String
musicLowBandDataUrl
;
final
String
thumbnail
;
final
String
thumbnail
;
final
String
title
;
final
String
title
;
final
String
description
;
final
String
description
;
...
@@ -173,6 +175,7 @@ class WeChatShareMusicModel extends WeChatShareModel {
...
@@ -173,6 +175,7 @@ class WeChatShareMusicModel extends WeChatShareModel {
this
.
musicLowBandUrl
,
this
.
musicLowBandUrl
,
this
.
title
:
""
,
this
.
title
:
""
,
this
.
description
:
""
,
this
.
description
:
""
,
this
.
musicDataUrl
,
String
thumbnail
,
String
thumbnail
,
WeChatScene
scene
,
WeChatScene
scene
,
String
messageExt
,
String
messageExt
,
...
@@ -194,7 +197,9 @@ class WeChatShareMusicModel extends WeChatShareModel {
...
@@ -194,7 +197,9 @@ class WeChatShareMusicModel extends WeChatShareModel {
_transaction:
transaction
,
_transaction:
transaction
,
_scene:
scene
.
toString
(),
_scene:
scene
.
toString
(),
"musicUrl"
:
musicUrl
,
"musicUrl"
:
musicUrl
,
"musicDataUrl"
:
musicDataUrl
,
"musicLowBandUrl"
:
musicLowBandUrl
,
"musicLowBandUrl"
:
musicLowBandUrl
,
"musicLowBandDataUrl"
:
musicLowBandDataUrl
,
_thumbnail:
thumbnail
,
_thumbnail:
thumbnail
,
_title:
title
,
_title:
title
,
_description:
description
,
_description:
description
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论