Я пытаюсь установить Facebook AccessToken в React Native на устройстве Android с помощью функции AccessToken.setCurrentAccessToken(...);
И я получаю следующую ошибку:
E/unknown:ReactNative: Exception in native call
java.lang.RuntimeException: Could not invoke FBAccessToken.setCurrentAccessToken
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:383)
<snip>
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
<snip>
Caused by: java.lang.NoSuchMethodError: No direct method <init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Collection;Ljava/util/Collection;Lcom/facebook/AccessTokenSource;Ljava/util/Date;Ljava/util/Date;)V in class Lcom/facebook/AccessToken; or its super classes (declaration of 'com.facebook.AccessToken' appears in /data/app/<app-name-here>/base.apk)
at com.facebook.reactnative.androidsdk.Utility.buildAccessToken(Utility.java:90)
at com.facebook.reactnative.androidsdk.FBAccessTokenModule.setCurrentAccessToken(FBAccessTokenModule.java:69)
at java.lang.reflect.Method.invoke(Native Method)
at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
<snip>
Я не уверен, почему он не может найти конструктор, так как типы соответствуют определению в документации: https://developers.facebook.com/docs/reference/android/current/class/AccessToken
и сборка компилируется, поэтому типы соответствуют определению, которое ожидается ...
Я использую React Native для генерации этой ошибки:
AccessToken.getCurrentAccessToken().then((ffff) => {
AccessToken.setCurrentAccessToken(ffff);
})
У меня есть эти записи в моем app/build.gradle
:
implementation 'com.facebook.android:facebook-android-sdk:[4,5)'
implementation project(':react-native-fbsdk')
и это в MainApplication.java
:
new FBSDKPackage(mCallbackManager),
и
private static CallbackManager mCallbackManager =
CallbackManager.Factory.create();
Это в settings.gradle
:
include ':react-native-fbsdk'
project(':react-native-fbsdk').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fbsdk/android')
Мне кажется, что в моей среде сборки используется один JAR, а во время выполнения - другой, так как здесь определен более новый класс AccessToken: https://developers.facebook.com/docs/reference/androidsdk/current/facebook/com/facebook/accesstoken.html/, но я не могу определить, какой из них на самом деле используется во время выполнения для дальнейшего расследования. Любые предложения относительно того, где / как это расследовать, будут с благодарностью приняты.
Этот код работал в прошлом ...
[Edit ....]
Проект build.gradle
:
buildscript {
repositories {
jcenter()
maven {
url 'https://maven.fabric.io/public'
}
mavenCentral()
google()
maven {
url "https://maven.google.com"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.google.gms:google-services:4.0.1'
// The Fabric Gradle plugin uses an open ended version to react
// quickly to Android tooling updates
classpath 'io.fabric.tools:gradle:1.+'
// svg to png
classpath('fr.avianey.androidsvgdrawable:gradle-plugin:3.0.0') {
// should be excluded to avoid conflict
exclude group: 'xerces'
}
}
}
allprojects {
repositories {
mavenLocal()
google()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
maven { url 'https://maven.fabric.io/public' }
// jitpack repo is necessary to fetch ucrop dependency
maven { url "https://jitpack.io" }
}
}
subprojects {
afterEvaluate {project ->
if (project.hasProperty("android")) {
android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
}
}
}
}
[Редактировать 2 ...]
Кроме того, код JS / React Native отлично работает на iOS, так что это проблема для Android ...