android - 将数字添加到 React Native for Android

标签 android react-native

有没有人成功地为 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/

相关文章:

javascript - 在 Android Chrome 52 上使用 Web MIDI API

android - 错误 : cannot find symbol class MediaStyle after migrating to androidx

javascript - typesafe-actions(createStandardAction) 不能在带有 redux 的服务器上工作

javascript - React Native 中的完整日历之类的库

javascript - React navigation didfocus 事件监听器在类组件和功能组件之间的工作方式不同

android - GCM 未收到注册 token

android - 如何在 Android 中通过蓝牙播放文本转语音?

android - 多个 Dex 文件错误。 Landroid/arch/lifecycle/LiveData$1

ios - 设置调试或发布 | react native - iOS

react-native - 如何禁用使用 expo build :web 生成源映射