有没有人成功地为 android 的 react native 配置数字?在 MainActivity.java 中添加 Digits 作为依赖项非常困难。
有没有办法通过 .addPackage 行将其添加为一个包?
更新: 我已经包装了数字,但在编译时遇到了问题。 如果有人对此有所投入并想帮我回答这个问题: Gradle @aar dependency resolution in react-native project 我将不胜感激。
最佳答案
如果您不严格遵守 Twitter 的做事方式,那么使用 Fabric 将是一个巨大的痛苦。
这是我的实现:
数字包.java
package com.yourapp.rctdigits;
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.ArrayList;
import java.util.Collections;
import java.util.List;
public class DigitsPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new DigitsModule(reactContext));
return modules;
}
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
数字模块.java
package com.yourapp.rctdigits;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import com.digits.sdk.android.AuthCallback;
import com.digits.sdk.android.Digits;
import com.digits.sdk.android.DigitsClient;
import com.digits.sdk.android.DigitsException;
import com.digits.sdk.android.DigitsOAuthSigning;
import com.digits.sdk.android.DigitsSession;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableNativeMap;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterAuthToken;
import com.twitter.sdk.android.core.TwitterCore;
import java.util.Map;
import io.fabric.sdk.android.Fabric;
public class DigitsModule extends ReactContextBaseJavaModule {
private static final String META_DATA_KEY = "io.fabric.ApiKey";
private static final String META_DATA_SECRET = "io.fabric.ApiSecret";
private static final String TAG = "RCTDigits";
volatile DigitsClient digitsClient;
private ReactApplicationContext mContext;
public DigitsModule(ReactApplicationContext reactContext) {
super(reactContext);
mContext = reactContext;
}
@Override
public String getName() {
return "DigitsManager";
}
@ReactMethod
public void launchAuthentication(final Callback successCallback, final Callback errorCallback) {
TwitterAuthConfig authConfig = getTwitterConfig();
Fabric.with(mContext, new TwitterCore(authConfig), new Digits());
AuthCallback callback = new AuthCallback() {
@Override
public void success(DigitsSession session, String phoneNumber) {
// Do something with the session and phone number
Log.i(TAG, "authentication successful");
TwitterAuthConfig authConfig = TwitterCore.getInstance().getAuthConfig();
TwitterAuthToken authToken = (TwitterAuthToken) session.getAuthToken();
DigitsOAuthSigning oauthSigning = new DigitsOAuthSigning(authConfig, authToken);
Map<String, String> authHeaders = oauthSigning.getOAuthEchoHeadersForVerifyCredentials();
WritableNativeMap authHeadersNativeMap = new WritableNativeMap();
for (Map.Entry<String, String> entry : authHeaders.entrySet()) {
authHeadersNativeMap.putString(entry.getKey(), entry.getValue());
}
WritableNativeMap result = new WritableNativeMap();
result.putMap("oAuthHeaders", authHeadersNativeMap);
result.putString("userId", String.valueOf(session.getId()));
result.putString("phoneNumber", session.getPhoneNumber());
successCallback.invoke(result);
}
@Override
public void failure(DigitsException exception) {
// Do something on failure
Log.e(TAG, "error " + exception.getMessage());
errorCallback.invoke(exception.getMessage());
}
};
int themeId = mContext.getResources().getIdentifier("CustomDigitsTheme", "style", mContext.getPackageName());
Digits.getInstance().authenticate(callback, themeId);
}
private TwitterAuthConfig getTwitterConfig() {
String key = getMetaData(META_DATA_KEY);
String secret = getMetaData(META_DATA_SECRET);
return new TwitterAuthConfig(key, secret);
}
// adapted from http://stackoverflow.com/questions/7500227/get-applicationinfo-metadata-in-oncreate-method
private String getMetaData(String name) {
try {
ApplicationInfo ai = mContext.getPackageManager().getApplicationInfo(
mContext.getPackageName(),
PackageManager.GET_META_DATA
);
Bundle metaData = ai.metaData;
if (metaData == null) {
Log.w(TAG, "metaData is null. Unable to get meta data for " + name);
} else {
String value = metaData.getString(name);
return value;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
主 Activity .java
将此行:.addPackage(new DigitsPackage())
添加到您的实例管理器
res/values/themes.xml
我使用自定义主题
<?xml version="1.0" encoding="utf-8"?>
<!-- Digits theme. -->
<resources>
<style name="CustomDigitsTheme" parent="android:Theme.Holo.Light">
<item name="android:textColorPrimary">@android:color/black</item>
<item name="android:textColorSecondary">@android:color/darker_gray</item>
<item name="android:windowBackground">@android:color/white</item>
<item name="android:textColorLink">#ffe74c3c</item>
<item name="android:colorAccent">#ffe74c3c</item>
</style>
</resources>
android/app/build.gradle
添加
repositories {
maven {
url 'https://maven.fabric.io/public'
}
}
和
dependencies {
compile('com.digits.sdk.android:digits:1.8.0@aar') {
transitive = true;
}
}
android/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.1'
classpath 'io.fabric.tools:gradle:1.+'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
mavenLocal()
jcenter()
}
}
AndroidManifest.xml
添加
<meta-data
android:name="io.fabric.ApiKey"
android:value="YOUR_API_KEY" />
<meta-data
android:name="io.fabric.ApiSecret"
android:value="YOUR_API_SECRET" />
js
var DigitsManager = require("react-native").NativeModules.DigitsManager;
DigitsManager.launchAuthentication((loginResponse) => {
Log.debug("[Digits]", "login successful", loginResponse);
}, (error) => {
Log.warn("[Digits]", "Login failed", error);
});
我应该用这个和 iOS 版本做一个 Github repo ......
关于android - 将数字添加到 React Native for Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33509733/