Android SDK Facebook и java.lang.NullPointerException
У меня проблемы с открытием активной сессии Facebook в моем приложении для Android в соответствии с руководством, размещенным по адресу https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/
Я боролся с этим в течение достаточно долгого времени без какой-либо удачи! Я буду рад, если один из вас укажет мне правильное направление! (Бьюсь об заклад, ошибка с некоторыми настройками на моей стороне, но я не могу ее обнаружить)
Вот ошибка, которую я вижу после вызова Session.openActiveSession (это, правда, новый Session.StatusCallback() в onCreate моей деятельности (я в значительной степени следую инструкциям, приведенным в руководствах для разработчиков Facevook)
РЕДАКТИРОВАТЬ: следующее предупреждающее сообщение регистрируется первым, а затем сообщение об ошибке на следующем снимке экрана
09-03 19:26:22.726: W/Bundle(17458): ключ com.facebook.platform.protocol.PROTOCOL_VERSION ожидается строка, но значением является java.lang.Integer. Значение по умолчанию было возвращено. 09-03 19: 26: 22.736: W/Bundle(17458): попытка создать сгенерированное внутреннее исключение: 09-03 19:26:22.736: W/Bundle(17458): java.lang.ClassCastException: java.lang.Integer не может быть приведен к java.lang.String 09-03 19:26:22.736: W/Bundle(17458): на android.os.Bundle.getString(Bundle.java:1061) 09-03 19:26:22.736: W/Bundle(17458): на android.content.Intent.getStringExtra(Intent.java:4466) 09-03 19:26:22.736: W/Bundle(17458): на com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient. Java:821) 09-03 19:26:22,736: W/Bundle(17458): на com.facebook.AuthorizationClient.tryCurrentHandler (AuthorizationClient.java:272)
09-02 22: 55: 04.110: E / AndroidRuntime (13287): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: главная 09-02 22:55:04.110: E/AndroidRuntime(13287): java.lang.RuntimeException: Невозможно возобновить активность {com.good.amrfbintegration / com.facebook.LoginActivity }: java.lang.NullPointerException 09-02 22: 55: 04.110: E / AndroidRuntime (13287): at android.app.ActivityThread.performResumeActivity (ActivityThread.java:3036) 09-02 22: 55: 04.110: E / AndroidRuntime (13287): на android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3077) 09-02 22:55:04.110: E/AndroidRuntime(13287): на android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2373)
Вот что я сделал до сих пор
Обновил приложение на Facebook, указав следующую информацию (я использовал хеш-ключ, созданный с помощью хранилища ключей отладки моей машины)
Вот соответствующая информация из моего файла манифеста (@string/app_id - это идентификатор приложения с портала Facebook)
Таким образом, я добавил ссылку на Facebook SDK в свой проект.
Вот код в моем методе OnCreate основной деятельности
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
Session.openActiveSession(this, true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
if (session.isOpened())
{
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
}
}});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
При выполнении Session.openActiveSession logcat отображает ошибку, показанную на моем первом снимке экрана.
Метод вызова Session.StatusCallback() выполняется один раз (в то время как сеанс имеет состояние "открытие"), но приложение завершается сбоем в следующий раз. вот что я вижу перед тем, как приложение вылетает
Будем очень благодарны любой помощи!
6 ответов
Эта проблема из-за Facebook SDK, пожалуйста, скачайте и используйте Facebook SDK 3.5.2 с этого URL: - https://developers.facebook.com/docs/android/
Да. Проверьте свой код,
Убедитесь, что у вас есть эти вещи на Manifest.xml
<activity android:name="com.facebook.LoginActivity"/>
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
И @string/app_id должен содержать app_id, который вы получаете из деталей конфигурации вашего приложения Facebook. Также там вы должны поставить правильный ключ.
Так что убедитесь -
- Ваш ключевой хэш верен
- Вы правильно настроили приложение в Интернете и позаботились о том, чтобы поместить идентификатор приложения в конфигурацию приложения.
Это случилось со мной и сегодня.
Моя проблема была в том, что приложение Facebook было в режиме песочницы. Так что только разработчики и тестеры могли использовать его.
Измените его на странице свойств Facebook Developer вашего приложения: https://developers.facebook.com/apps
Также нашел мой ответ здесь: Не удается получить доступ к сессии Facebook - UnknownError: Неверное приложение
Я немного копался в SDK (3.5), и кажется, что EXTRA_PROTOCOL_VERSION всегда сохраняется как целое число, а не как строка. Т.е. в NativeProtocol.java:
public static Intent createPlatformActivityIntent(Context context, String action, int version, Bundle extras) {
Intent intent = new Intent()
.setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT)
.putExtras(extras)
.putExtra(EXTRA_PROTOCOL_VERSION, version) //version --> int
.putExtra(EXTRA_PROTOCOL_ACTION, action);
return validateKatanaActivityIntent(context, intent);
}
public static Intent createPlatformServiceIntent(Context context) {
Intent intent = new Intent(INTENT_ACTION_PLATFORM_SERVICE)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT);
return validateKatanaServiceIntent(context, intent);
}
public static Intent createLoginDialog20121101Intent(Context context, String applicationId, ArrayList<String> permissions,
String audience) {
Intent intent = new Intent()
.setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT)
.putExtra(EXTRA_PROTOCOL_VERSION, PROTOCOL_VERSION_20121101) // PROTOCOL_VERSION_20121101 --> int
.putExtra(EXTRA_PROTOCOL_ACTION, ACTION_LOGIN_DIALOG)
.putExtra(EXTRA_APPLICATION_ID, applicationId)
.putStringArrayListExtra(EXTRA_PERMISSIONS, ensureDefaultPermissions(permissions))
.putExtra(EXTRA_PROTOCOL_CALL_ID, generateCallId())
.putExtra(EXTRA_WRITE_PRIVACY, ensureDefaultAudience(audience));
return validateKatanaActivityIntent(context, intent);
}
И в том месте, где разработчики обычно получают эту ошибку, читается как строка (AuthorizationCLient.java l:820):
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,
intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));
Это не будет работать ни в коем случае, так что это все еще ошибка в SDK. Просто при некоторых обстоятельствах этот сегмент исполняется.
Любые комментарии?
Я получил ту же ошибку, Google много вещей, и, наконец, это то, что я сделал, чтобы избежать этой ошибки
private void getHashKey()
{
PackageInfo info;
try {
info = getPackageManager().getPackageInfo("Your_Package_Name", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {MessageDigest md;
md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
//String something = new String(Base64.encode(md.digest(), 0));
String something = new String(Base64.encode(md.digest(),0));
Log.e("** Hash Key", something);
}
}
catch (NameNotFoundException e1) {
Log.e("name not found", e1.toString());
}
catch (NoSuchAlgorithmException e) {
Log.e("no such an algorithm", e.toString());
}
catch (Exception e){
Log.e("exception", e.toString());
}
}
Итак, я использовал Hash_Key, сгенерированный этим кодом, и обновил его в своей консоли разработчика на Facebook. Это решило мою проблему. Вероятно, некоторые проблемы с Windows Key_gen или Android Key_store
А также проверьте файл AuthorizationClient.java из Facebook Sdk в строке 820.
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,"" +
intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));
Я сделал это для "getIntExtra", где они имели это как "getStringExtra". Внесение этих изменений сработало для меня. Надеюсь, это сработает и для тебя.
// Just write your code in onResume() rather than onCreate().
@Override
public void onResume() {
super.onResume();
if(Session.getActiveSession()==null){
session = new Session(this);
Session.setActiveSession(session);
}
if (Session.getActiveSession().isOpened())
{
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
}else{
Session.openActiveSession(this, true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
if (session.isOpened())
{
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
}
}});
}
}
}