This commit is contained in:
2020-02-25 22:39:44 +08:00
commit 94d30a7854
29 changed files with 3648 additions and 0 deletions

33
android/build.gradle Normal file
View File

@ -0,0 +1,33 @@
apply plugin: 'com.android.library'
def safeExtGet(prop, fallback) {
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}
android {
compileSdkVersion safeExtGet("compileSdkVersion", 28)
defaultConfig {
minSdkVersion safeExtGet('minSdkVersion', 16)
targetSdkVersion safeExtGet('targetSdkVersion', 28)
versionCode 1
versionName "1.0"
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
}
repositories {
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
}
dependencies {
implementation 'com.facebook.react:react-native:+'
implementation files('libs/mta-sdk-1.6.2.jar')
implementation files('libs/open_sdk_r2973327_lite.jar')
}

BIN
android/libs/mta-sdk-1.6.2.jar Executable file

Binary file not shown.

Binary file not shown.

BIN
android/libs/open_sdk_r5756.jar Executable file

Binary file not shown.

View File

@ -0,0 +1,28 @@
<manifest
package="cn.reactnative.modules.qq"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<meta-data android:name="QQ_APPID" android:value="${QQ_APPID}"/>
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent${QQ_APPID}" />
</intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
</application>
</manifest>

View File

@ -0,0 +1,260 @@
package cn.reactnative.modules.qq;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.app.Activity;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.RCTNativeAppEventEmitter;
import com.tencent.connect.common.Constants;
import com.tencent.connect.share.QQShare;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
import org.json.JSONObject;
import java.util.Date;
/**
* Created by tdzl2_000 on 2015-10-10.
*
* Modified by Renguang Dong on 2016-05-25.
*/
public class QQModule extends ReactContextBaseJavaModule implements IUiListener, ActivityEventListener {
private String appId;
private Tencent api;
private final static String INVOKE_FAILED = "QQ API invoke returns false.";
private boolean isLogin;
private static final String RCTQQShareTypeNews = "news";
private static final String RCTQQShareTypeImage = "image";
private static final String RCTQQShareTypeText = "text";
private static final String RCTQQShareTypeVideo = "video";
private static final String RCTQQShareTypeAudio = "audio";
private static final String RCTQQShareType = "type";
private static final String RCTQQShareText = "text";
private static final String RCTQQShareTitle = "title";
private static final String RCTQQShareDescription = "description";
private static final String RCTQQShareWebpageUrl = "webpageUrl";
private static final String RCTQQShareImageUrl = "imageUrl";
private static final int SHARE_RESULT_CODE_SUCCESSFUL = 0;
private static final int SHARE_RESULT_CODE_FAILED = 1;
private static final int SHARE_RESULT_CODE_CANCEL = 2;
public QQModule(ReactApplicationContext context) {
super(context);
ApplicationInfo appInfo = null;
try {
appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
throw new Error(e);
}
if (!appInfo.metaData.containsKey("QQ_APPID")){
throw new Error("meta-data QQ_APPID not found in AndroidManifest.xml");
}
this.appId = appInfo.metaData.get("QQ_APPID").toString();
}
@Override
public void initialize() {
super.initialize();
if (api == null) {
api = Tencent.createInstance(appId, getReactApplicationContext().getApplicationContext());
}
getReactApplicationContext().addActivityEventListener(this);
}
@Override
public void onCatalystInstanceDestroy() {
if (api != null){
api = null;
}
getReactApplicationContext().removeActivityEventListener(this);
super.onCatalystInstanceDestroy();
}
@Override
public String getName() {
return "RCTQQAPI";
}
@ReactMethod
public void isQQInstalled(Promise promise) {
if (api.isSupportSSOLogin(getCurrentActivity())) {
promise.resolve(true);
}
else {
promise.reject("not installed");
}
}
@ReactMethod
public void isQQSupportApi(Promise promise) {
if (api.isSupportSSOLogin(getCurrentActivity())) {
promise.resolve(true);
}
else {
promise.reject("not support");
}
}
@ReactMethod
public void login(String scopes, Promise promise){
this.isLogin = true;
if (!api.isSessionValid()){
api.login(getCurrentActivity(), scopes == null ? "get_simple_userinfo" : scopes, this);
promise.resolve(null);
} else {
promise.reject(INVOKE_FAILED);
}
}
@ReactMethod
public void shareToQQ(ReadableMap data, Promise promise){
this._shareToQQ(data, 0);
promise.resolve(null);
}
@ReactMethod
public void shareToQzone(ReadableMap data, Promise promise){
this._shareToQQ(data, 1);
promise.resolve(null);
}
private void _shareToQQ(ReadableMap data, int scene) {
this.isLogin = false;
Bundle bundle = new Bundle();
if (data.hasKey(RCTQQShareTitle)){
bundle.putString(QQShare.SHARE_TO_QQ_TITLE, data.getString(RCTQQShareTitle));
}
if (data.hasKey(RCTQQShareDescription)){
bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, data.getString(RCTQQShareDescription));
}
if (data.hasKey(RCTQQShareWebpageUrl)){
bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, data.getString(RCTQQShareWebpageUrl));
}
if (data.hasKey(RCTQQShareImageUrl)){
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, data.getString(RCTQQShareImageUrl));
}
if (data.hasKey("appName")){
bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, data.getString("appName"));
}
String type = RCTQQShareTypeNews;
if (data.hasKey(RCTQQShareType)) {
type = data.getString(RCTQQShareType);
}
if (type.equals(RCTQQShareTypeNews)){
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
} else if (type.equals(RCTQQShareTypeImage)){
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, data.getString(RCTQQShareImageUrl));
} else if (type.equals(RCTQQShareTypeAudio)) {
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_AUDIO);
if (data.hasKey("flashUrl")){
bundle.putString(QQShare.SHARE_TO_QQ_AUDIO_URL, data.getString("flashUrl"));
}
} else if (type.equals("app")){
bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_APP);
}
Log.e("QQShare", bundle.toString());
if (scene == 0 ) {
// Share to QQ.
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE);
api.shareToQQ(getCurrentActivity(), bundle, this);
}
else if (scene == 1) {
// Share to Qzone.
bundle.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
api.shareToQQ(getCurrentActivity(), bundle, this);
}
}
private String _getType() {
return (this.isLogin?"QQAuthorizeResponse":"QQShareResponse");
}
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
Tencent.onActivityResultData(requestCode, resultCode, data, this);
}
public void onNewIntent(Intent intent){
}
@Override
public void onComplete(Object o) {
WritableMap resultMap = Arguments.createMap();
if (isLogin) {
resultMap.putString("type", "QQAuthorizeResponse");
try {
JSONObject obj = (JSONObject) (o);
resultMap.putInt("errCode", 0);
resultMap.putString("openid", obj.getString(Constants.PARAM_OPEN_ID));
resultMap.putString("access_token", obj.getString(Constants.PARAM_ACCESS_TOKEN));
resultMap.putString("oauth_consumer_key", this.appId);
resultMap.putDouble("expires_in", (new Date().getTime() + obj.getLong(Constants.PARAM_EXPIRES_IN)));
} catch (Exception e){
WritableMap map = Arguments.createMap();
map.putInt("errCode", Constants.ERROR_UNKNOWN);
map.putString("errMsg", e.getLocalizedMessage());
getReactApplicationContext()
.getJSModule(RCTNativeAppEventEmitter.class)
.emit("QQ_Resp", map);
}
} else {
resultMap.putString("type", "QQShareResponse");
resultMap.putInt("errCode", SHARE_RESULT_CODE_SUCCESSFUL);
resultMap.putString("message", "Share successfully.");
}
this.resolvePromise(resultMap);
}
@Override
public void onError(UiError uiError) {
WritableMap resultMap = Arguments.createMap();
resultMap.putInt("errCode", SHARE_RESULT_CODE_FAILED);
resultMap.putString("message", "Share failed." + uiError.errorDetail);
this.resolvePromise(resultMap);
}
@Override
public void onCancel() {
WritableMap resultMap = Arguments.createMap();
resultMap.putInt("errCode", SHARE_RESULT_CODE_CANCEL);
resultMap.putString("message", "Share canceled.");
this.resolvePromise(resultMap);
}
private void resolvePromise(ReadableMap resultMap) {
getReactApplicationContext()
.getJSModule(RCTNativeAppEventEmitter.class)
.emit("QQ_Resp", resultMap);
}
}

View File

@ -0,0 +1,33 @@
package cn.reactnative.modules.qq;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Created by tdzl2_000 on 2015-10-10.
*/
public class QQPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Arrays.asList(new NativeModule[]{
// Modules from third-party
new QQModule(reactContext),
});
}
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}