java Android 错误:无法恢复活动..?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/34736536/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 23:15:11  来源:igfitidea点击:

Android Error: Unable to resume activity..?

javaandroidfacebook-sdk-4.0

提问by Arpit Tomar

I'm new to android and trying to add Facebook login and catch the event after clicking the Logout button(using AccessTokenTracker) in android using facebook sdk using Android studio but i'm getting this error

here is the logcat,

我是 android 的新手,并尝试在 android 中使用 facebook sdk 使用 Android studio 单击注销按钮(使用 AccessTokenTracker)后添加 Facebook 登录并捕获事件,但我在

这里收到此错误是 logcat,

// (please horizontal scroll for logcat)
01-12 00:47:15.306 12572-12572/com.example.arpit.facebooklogindemo E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 java.lang.RuntimeException: Unable to resume activity {com.example.arpit.facebooklogindemo/com.example.arpit.facebooklogindemo.MainActivity}: java.lang.NullPointerException
 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2790)
 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2819)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2266)
 at android.app.ActivityThread.access0(ActivityThread.java:141)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:137)
 at android.app.ActivityThread.main(ActivityThread.java:5103)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:525)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
 at dalvik.system.NativeStart.main(Native Method)
                                                                                  Caused by: java.lang.NullPointerException
 at com.example.arpit.facebooklogindemo.MainActivity.onResume(MainActivity.java:83)
 at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
 at android.app.Activity.performResume(Activity.java:5211)
 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2780)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2819)?
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2266)?
at android.app.ActivityThread.access0(ActivityThread.java:141)?
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)?
at android.os.Handler.dispatchMessage(Handler.java:99)?
at android.os.Looper.loop(Looper.java:137)?
at android.app.ActivityThread.main(ActivityThread.java:5103)?
at java.lang.reflect.Method.invokeNative(Native Method)?
at java.lang.reflect.Method.invoke(Method.java:525)?
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)?
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)?
at dalvik.system.NativeStart.main(Native Method)

Here is AndroidManifest.xml,

这是AndroidManifest.xml,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.arpit.facebooklogindemo">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

         //from http://developers.facebook.com
        <meta-data android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/app_id"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        //from http://developers.facebook.com
        <activity android:name="com.facebook.FacebookActivity"
            android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:label="@string/app_name" />

    </application>

</manifest>

Here is activity_main.xml,

这是activity_main.xml,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.arpit.facebooklogindemo.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:id="@+id/textView2" />

     //from http://developers.facebook.com
    <com.facebook.login.widget.LoginButton
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView"
        android:layout_above="@+id/login_button"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="90dp" />

</RelativeLayout>

Here is MainActivity.java,

这是 MainActivity.java,

package com.example.arpit.facebooklogindemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.Profile;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

public class MainActivity extends AppCompatActivity {

    CallbackManager callbackManager;
    LoginButton loginButton;
    TextView textView;
    AccessTokenTracker accessTokenTracker;

    private FacebookCallback<LoginResult> mFacebookCallback = new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Profile profile = Profile.getCurrentProfile();
            if(profile != null){
                fillTextView(profile);
            }
        }

        @Override
        public void onCancel() {

        }

        @Override
        public void onError(FacebookException error) {
            Log.d("find", String.valueOf(error));
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.textView);

        callbackManager = CallbackManager.Factory.create();

        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
                if(currentAccessToken == null){
                    textView.setText("Logged out");
                }
            }
        };
        accessTokenTracker.startTracking();

        loginButton = (LoginButton)findViewById(R.id.login_button);

        loginButton.registerCallback(callbackManager, mFacebookCallback);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onResume(){
        super.onResume();
        Profile profile = Profile.getCurrentProfile();
        textView.setText(profile.getName());
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        accessTokenTracker.stopTracking();
    }

    private void fillTextView(Profile profile){
        textView.setText(profile.getName());
    }
}

采纳答案by Geeky Singh

Look at this line in your logs:

查看日志中的这一行:

Caused by: java.lang.NullPointerException
at com.example.arpit.facebooklogindemo.MainActivity.onResume(MainActivity.java:83)

It is clearly mentioned that your app is crashing due to NullPointerExceptionin onResume()function. One possible reason is you might be getting null profile details while calling profile.getName()

它明确地表示您的应用程序崩溃是由于对NullPointerExceptiononResume()功能。一个可能的原因是您在调用时可能会获得空的个人资料详细信息profile.getName()

Make a null checking before setting text as below:

在设置文本之前进行空检查,如下所示:

Profile profile = Profile.getCurrentProfile();
if(null != profile)
        textView.setText(profile.getName());

Sometimes, you might get null or old profile details. In such case, you need to request for updated profile details. Below is samle code:

有时,您可能会获得空或旧的个人资料详细信息。在这种情况下,您需要请求更新配置文件的详细信息。下面是示例代码:

 Profile profile = Profile.getCurrentProfile();
    if(null != profile) {
          new ProfileTracker() {
                                @Override
                                protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
                                    if (currentProfile != null) {
                                        // handle it
                                        stopTracking();
                                    }
                                }
                            }.startTracking();
    } else {
            textView.setText(profile.getName());
}

回答by dumb_terminal

put a null check on your onResume before setting textView.

在设置 textView 之前对您的 onResume 进行空检查。