Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用facebook SDK登录和注销时出错_Android_Facebook - Fatal编程技术网

Android 使用facebook SDK登录和注销时出错

Android 使用facebook SDK登录和注销时出错,android,facebook,Android,Facebook,这是我的主要活动: package com.FBupdater; import java.io.IOException; import java.net.MalformedURLException; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Ima

这是我的主要活动:

package com.FBupdater;

import java.io.IOException;
import java.net.MalformedURLException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;

import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;

public class MainActivity extends Activity implements OnClickListener {

    String APP_ID = getString(R.string.APP_ID);
    Facebook fb;
    ImageButton button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fb = new Facebook(APP_ID);

        button = (ImageButton)findViewById(R.id.loginbtn);
        button.setOnClickListener(this);

        updateContentView();
    }

    private void updateContentView() {
        // TODO Auto-generated method stub
        if(fb.isSessionValid()){
            Toast.makeText(MainActivity.this, "done", Toast.LENGTH_LONG).show();
            button.setImageResource(R.drawable.logout);
        }else{
            button.setImageResource(R.drawable.login);
        }
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if(fb.isSessionValid()){
            //button close our session - log out of facebook
            try {
                fb.logout(getApplicationContext());
                updateContentView();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            //login to facebook
            fb.authorize(MainActivity.this, new DialogListener() {

                @Override
                public void onFacebookError(FacebookError e) {
                    // TODO Auto-generated method stub
                    Toast.makeText(MainActivity.this, "onFBerror", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(DialogError e) {
                    // TODO Auto-generated method stub
                    Toast.makeText(MainActivity.this, "onError", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onComplete(Bundle values) {
                    // TODO Auto-generated method stub
                    updateContentView(); 
                }

                @Override
                public void onCancel() {
                    // TODO Auto-generated method stub
                    Toast.makeText(MainActivity.this, "onCancel", Toast.LENGTH_LONG).show();

                }
            });
        }
    }

}
这是我的AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.FBupdater"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.FBupdater.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>
这是我的活动_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="#000000" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="70dp"
        android:layout_gravity="center"
        android:gravity="center"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/notloggedinmessage"
            android:textColor="#ffffff"
            android:textSize="20sp" />

        <ImageButton
            android:id="@+id/loginbtn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@drawable/login"
            android:src="@drawable/login" />

    </LinearLayout>

</LinearLayout>
下面是错误日志:

////单击注销按钮后:

11-28 15:22:56.824: D/AndroidRuntime(2123): Shutting down VM
11-28 15:22:56.824: W/dalvikvm(2123): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
11-28 15:22:57.034: E/AndroidRuntime(2123): FATAL EXCEPTION: main
11-28 15:22:57.034: E/AndroidRuntime(2123): android.os.NetworkOnMainThreadException
11-28 15:22:57.034: E/AndroidRuntime(2123):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at com.facebook.android.Util.openUrl(Util.java:215)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at com.facebook.android.Facebook.request(Facebook.java:777)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at com.facebook.android.Facebook.request(Facebook.java:693)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at com.facebook.android.Facebook.logout(Facebook.java:652)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at com.timelystatusupdater.MainActivity.onClick(MainActivity.java:54)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at android.view.View.performClick(View.java:3511)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at android.view.View$PerformClick.run(View.java:14105)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at android.os.Handler.handleCallback(Handler.java:605)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at android.os.Looper.loop(Looper.java:137)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at android.app.ActivityThread.main(ActivityThread.java:4424)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at java.lang.reflect.Method.invokeNative(Native Method)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at java.lang.reflect.Method.invoke(Method.java:511)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-28 15:22:57.034: E/AndroidRuntime(2123):     at dalvik.system.NativeStart.main(Native Method)
11-28 15:22:57.534: D/dalvikvm(2123): GC_CONCURRENT freed 400K, 9% free 5888K/6407K, paused 10ms+34ms
11-28 15:22:57.874: I/dalvikvm(2123): threadid=3: reacting to signal 3
11-28 15:22:57.994: I/dalvikvm(2123): Wrote stack traces to '/data/anr/traces.txt'
11-28 15:23:07.315: I/Process(2123): Sending signal. PID: 2123 SIG: 9
在视频教程中,他说这很简单。他使用了facebook.logoutContext上下文函数。他的代码很好用,但我的代码不行

那么,问题是什么,我不明白。提前谢谢

注:我是Android和Facebook SDK的新手。事实上,这是我在android上的第一个项目

我为min android sdk 8和target sdk 16运行此项目 当我在android 2.3.3 api 10 emulator中运行它时,我可以很容易地注销,但当我在android 4.0.3 api 15 emulator中运行它时,我可以登录,但当我尝试注销应用程序时,会崩溃,出现上面的错误

下面是视频教程:


在视频教程中,他说这很简单。他使用了facebook.logoutContext上下文函数。他的代码很好用,但我的代码不行。

在你的facebook.java中有一个函数

public void authorize(Activity activity, String[] permissions, int activityCode, final DialogListener listener) 
    {

        boolean singleSignOnStarted = true;

        mAuthDialogListener = listener;
        Log.d("in authorise", "authorise");
        // Prefer single sign-on, where available.
        **if (activityCode >= 0) 
        {
            Log.d("single sign", "single sign");
            singleSignOnStarted = startSingleSignOn(activity, mAppId, permissions, activityCode);
        }**/////put comment for this code...
        // Otherwise fall back to traditional dialog.
       // else
            startDialogAuth(activity, permissions);

    }

你使用的Facebook SDK版本相当旧是的,我知道它是最新发布的。因此,它内部所做的一些事情是为了在Froyo 2.2上工作,而没有考虑ICS 4.0引入的更改

ICS中的一个变化是应用程序的严格模式默认打开。严格模式在运行时对应用程序行为应用一系列检查,以确保最佳实践和流畅的用户体验。其中一个检查是应用程序是否在主线程上执行网络请求。这是一个重要的检查,因为网络请求可能会阻塞很长时间,在此期间,在主线程上呈现的UI将对用户无响应

您在ICS上看到的错误正是-在主线程上对netwrok请求的严格检查在Facebook注销方法中失败。因此出现了异常NetworkOnMainThread

为了避免这种情况,在onClickListener中,可以使用AsyncTask和simple Runnable,使用静态方法在另一个线程上启动注销。类似于在浏览器中编写的代码,请检查是否正常:

    // ... cut ...
    if(fb.isSessionValid()){
        //button close our session - log out of facebook
        try {
            AsyncTask.execute(new Runnable() {
                @Override
                public void run() {
                    fb.logout(getApplicationContext());
                    // You can also use MainActivity.this instead of getApplicationContext()
                }
            });
            updateContentView();
        } catch (MalformedURLException e) {
    // ... cut ...

这是一个简单的版本,当然,只是为了解除你的阻碍。如果你想让你的用户界面与注销完成时完全同步,你就必须编写更多的代码。

Facebook API每天都在变化,这是一个垃圾,但你可以检查这个项目,我认为它将非常适合你


啊哈,我遵循了AsyncFacebookRunner.java类并使用了它的注销方法,问题就解决了


但在视频教程中,他做了与我在问题中键入的相同的编码。所以,如果他的应用程序运行良好,那么我的应用程序也应该运行良好。但事实并非如此。那么问题是什么呢。我不了解你的解决方案,因为我是android和facebook sdk的新手。那么问题是什么?我该怎么办@谁能给我点东西吗。我要死在这里:我写下你描述的代码。但是eclipse说:这行有多个标记-不能对非静态方法exicuteObject进行静态引用。。。从类型AsyncTask中,AsyncTask是原始类型。对泛型类型AsyncTask的引用应该参数化-类型安全:方法executObject。。。属于原始类型AsyncTask。对泛型类型AsyncTask的引用应该参数化,那么,我现在应该怎么做@Franci Penova请确保您使用的是API级别11,因为当时添加了静态执行方法。如果您想支持较旧的API级别,那么您需要创建自己的AsyncTask子类。由于您的目标是min API 8,您将不得不使用自己的AsyncTask子类和doInBackground override.aha中的call logout编写稍有不同的代码,我遵循了AsyncFacebookRunner.java类并使用了它的logout方法,问题就解决了。但现在我面临一个新问题。你能帮帮我吗。以下是链接:@FranciPenovThis更适合作为OP上的评论,因为即使它指向了官方Facebook for Android SDK的正确位置,但它并没有解决这个问题。
myAsyncFB.logout(Context, RequestListener);