diff --git a/README.md b/README.md index 116a4db..a6d62dc 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,13 @@ flutter版新浪微博SDK * [simple_pub_server](https://github.com/v7lin/simple_pub_server) +## docs + +* [Android 应用接入](https://open.weibo.com/wiki/Sdk/android) +* [iOS 应用接入](https://open.weibo.com/wiki/Sdk/ios) +* [Android Github](https://github.com/sinaweibosdk/weibo_android_sdk) +* [iOS Github](https://github.com/sinaweibosdk/weibo_ios_sdk) + ## android ```` diff --git a/android/src/main/java/io/github/v7lin/fakeweibo/FakeWeiboPlugin.java b/android/src/main/java/io/github/v7lin/fakeweibo/FakeWeiboPlugin.java index 4e4a22d..e98ebc3 100644 --- a/android/src/main/java/io/github/v7lin/fakeweibo/FakeWeiboPlugin.java +++ b/android/src/main/java/io/github/v7lin/fakeweibo/FakeWeiboPlugin.java @@ -1,6 +1,7 @@ package io.github.v7lin.fakeweibo; import android.content.Intent; +import android.net.Uri; import android.text.TextUtils; import com.sina.weibo.sdk.WbSdk; @@ -72,6 +73,7 @@ public class FakeWeiboPlugin implements MethodCallHandler, PluginRegistry.Activi private static final String ARGUMENT_KEY_DESCRIPTION = "description"; private static final String ARGUMENT_KEY_THUMBDATA = "thumbData"; private static final String ARGUMENT_KEY_IMAGEDATA = "imageData"; + private static final String ARGUMENT_KEY_IMAGEURI = "imageUri"; private static final String ARGUMENT_KEY_WEBPAGEURL = "webpageUrl"; private static final String ARGUMENT_KEY_RESULT_ERRORCODE = "errorCode"; @@ -182,8 +184,20 @@ public class FakeWeiboPlugin implements MethodCallHandler, PluginRegistry.Activi WeiboMultiMessage message = new WeiboMultiMessage(); if (METHOD_SHAREIMAGE.equals(call.method)) { + if (call.hasArgument(ARGUMENT_KEY_TEXT)) { + TextObject object = new TextObject(); + object.text = call.argument(ARGUMENT_KEY_TEXT);// 1024 + + message.textObject = object; + } + ImageObject object = new ImageObject(); - object.imageData = call.argument(ARGUMENT_KEY_IMAGEDATA);// 2 * 1024 * 1024 + if (call.hasArgument(ARGUMENT_KEY_IMAGEDATA)) { + object.imageData = call.argument(ARGUMENT_KEY_IMAGEDATA);// 2 * 1024 * 1024 + } else if (call.hasArgument(ARGUMENT_KEY_IMAGEURI)) { + String imageUri = call.argument(ARGUMENT_KEY_IMAGEURI); + object.imagePath = Uri.parse(imageUri).getPath();// 512 - 10 * 1024 * 1024 + } message.mediaObject = object; } else if (METHOD_SHAREWEBPAGE.equals(call.method)) { diff --git a/example/lib/main.dart b/example/lib/main.dart index 7e2bda7..357d622 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -143,6 +143,7 @@ class _HomeState extends State { await image.obtainKey(createLocalImageConfiguration(context)); ByteData imageData = await key.bundle.load(key.name); await _weibo.shareImage( + text: 'Share Text', imageData: imageData.buffer.asUint8List(), ); }, diff --git a/ios/Classes/FakeWeiboPlugin.m b/ios/Classes/FakeWeiboPlugin.m index bb34b43..550e7e5 100644 --- a/ios/Classes/FakeWeiboPlugin.m +++ b/ios/Classes/FakeWeiboPlugin.m @@ -36,6 +36,7 @@ static NSString * const ARGUMENT_KEY_TITLE = @"title"; static NSString * const ARGUMENT_KEY_DESCRIPTION = @"description"; static NSString * const ARGUMENT_KEY_THUMBDATA = @"thumbData"; static NSString * const ARGUMENT_KEY_IMAGEDATA = @"imageData"; +static NSString * const ARGUMENT_KEY_IMAGEURI = @"imageUri"; static NSString * const ARGUMENT_KEY_WEBPAGEURL = @"webpageUrl"; static NSString * const ARGUMENT_KEY_RESULT_ERRORCODE = @"errorCode"; @@ -95,9 +96,16 @@ static NSString * const ARGUMENT_KEY_RESULT_EXPIRESIN = @"expiresIn"; WBSendMessageToWeiboRequest * request = [WBSendMessageToWeiboRequest request]; WBMessageObject * message = [WBMessageObject message]; if ([METHOD_SHAREIMAGE isEqualToString:call.method]) { + message.text = call.arguments[ARGUMENT_KEY_TEXT]; WBImageObject * object = [WBImageObject object]; FlutterStandardTypedData * imageData = call.arguments[ARGUMENT_KEY_IMAGEDATA]; - object.imageData = imageData.data; + if (imageData != nil) { + object.imageData = imageData.data; + } else { + NSString * imageUri = call.arguments[ARGUMENT_KEY_IMAGEURI]; + NSURL * imageUrl = [NSURL URLWithString:imageUri]; + object.imageData = [NSData dataWithContentsOfFile:imageUrl.path]; + } message.imageObject = object; } else if ([METHOD_SHAREWEBPAGE isEqualToString:call.method]) { WBWebpageObject * object = [WBWebpageObject object]; diff --git a/lib/src/weibo.dart b/lib/src/weibo.dart index c33ae02..6315723 100644 --- a/lib/src/weibo.dart +++ b/lib/src/weibo.dart @@ -28,19 +28,22 @@ class Weibo { static const String _ARGUMENT_KEY_DESCRIPTION = 'description'; static const String _ARGUMENT_KEY_THUMBDATA = 'thumbData'; static const String _ARGUMENT_KEY_IMAGEDATA = 'imageData'; + static const String _ARGUMENT_KEY_IMAGEURI = 'imageUri'; static const String _ARGUMENT_KEY_WEBPAGEURL = 'webpageUrl'; + static const String _SCHEME_FILE = 'file'; + static const String _DEFAULT_REDIRECTURL = 'https://api.weibo.com/oauth2/default.html'; final MethodChannel _channel = - const MethodChannel('v7lin.github.io/fake_weibo'); + const MethodChannel('v7lin.github.io/fake_weibo'); final StreamController _authRespStreamController = - StreamController.broadcast(); + StreamController.broadcast(); final StreamController _shareMsgRespStreamController = - StreamController.broadcast(); + StreamController.broadcast(); Future registerApp({ @required String appKey, @@ -119,7 +122,7 @@ class Weibo { }; return HttpClient() .getUrl(_encodeUrl('https://api.weibo.com/2/users/show.json', appkey, - accessToken, params)) + accessToken, params)) .then((HttpClientRequest request) { return request.close(); }).then((HttpClientResponse response) async { @@ -129,21 +132,20 @@ class Weibo { .fromMap(json.decode(content) as Map); } throw HttpException( - 'HttpResponse statusCode: ${response.statusCode}, reasonPhrase: ${response.reasonPhrase}.'); + 'HttpResponse statusCode: ${response + .statusCode}, reasonPhrase: ${response.reasonPhrase}.'); }); } - Uri _encodeUrl( - String baseUrl, - String appkey, - String accessToken, - Map params, - ) { + Uri _encodeUrl(String baseUrl, + String appkey, + String accessToken, + Map params,) { params.putIfAbsent('source', () => appkey); params.putIfAbsent('access_token', () => accessToken); Uri baseUri = Uri.parse(baseUrl); Map> queryParametersAll = - Map>.of(baseUri.queryParametersAll); + Map>.of(baseUri.queryParametersAll); params.forEach((String key, String value) { queryParametersAll.remove(key); queryParametersAll.putIfAbsent(key, () => [value]); @@ -155,7 +157,7 @@ class Weibo { Future shareText({ @required String text, }) { - assert(text != null && text.isNotEmpty && text.length <= 1024); + assert(text != null && text.length <= 1024); return _channel.invokeMethod( _METHOD_SHARETEXT, { @@ -166,15 +168,27 @@ class Weibo { /// 分享 - 图片 Future shareImage({ - @required Uint8List imageData, + String text, + Uint8List imageData, + Uri imageUri, }) { - assert(imageData != null && imageData.lengthInBytes <= 2 * 1024 * 1024); - return _channel.invokeMethod( - _METHOD_SHAREIMAGE, - { - _ARGUMENT_KEY_IMAGEDATA: imageData, - }, - ); + assert(text == null || text.length <= 1024); + assert((imageData != null && imageData.lengthInBytes <= 2 * 1024 * 1024) || + (imageUri != null && + imageUri.isScheme(_SCHEME_FILE) && + imageUri.toFilePath().length <= 512 && + File.fromUri(imageUri).lengthSync() <= 10 * 1024 * 1024)); + Map map = {}; + if (text != null && text.isNotEmpty) { + map.putIfAbsent(_ARGUMENT_KEY_TEXT, () => text); + } + if (imageData != null) { + map.putIfAbsent(_ARGUMENT_KEY_IMAGEDATA, () => imageData); + } + if (imageUri != null) { + map.putIfAbsent(_ARGUMENT_KEY_IMAGEURI, () => imageUri.toString()); + } + return _channel.invokeMethod(_METHOD_SHAREIMAGE, map); } /// 分享 - 网页