-2

ログインボタンをクリックすると、Facebookにログインし(初めて許可を求めます)、すべて問題ありません。しかし、その後ログアウトをクリックすると、「残念ながらアプリが停止しました」というエラーが表示され、アプリが閉じます。その問題の解決策を探しましたが、自分に合った解決策が見つかりませんでした。これが私のコードです:

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

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

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainMenu extends Activity {

ImageView btnLogin;
Facebook fb;
private SharedPreferences shared_pref;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);
    btnLogin = (ImageView) findViewById(R.id.buttonFb);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

    //tryToGetDataFromPreviousLogin();

    createButtons();
}

private void tryToGetDataFromPreviousLogin() {
    shared_pref = getPreferences(MODE_PRIVATE);
    String access_token = shared_pref.getString("access_token", null);
    long expires = shared_pref.getLong("access_expires", 0);

    if(access_token != null) {
        fb.setAccessToken(access_token);
    }

    if(expires != 0) {
        fb.setAccessExpires(expires);
    }
}

private void createButtons() {
    createBtnExit();
    createBtnStart();
    createBtnFbLogin();
    createBtnSettings();        
}

private void createBtnExit() {
    Button btnExit = (Button) findViewById(R.id.buttonExit);
    btnExit.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            popQuitDialog();
        }
    });
}

private void createBtnStart() {
    Button btnStart = (Button) findViewById(R.id.buttonStart);
    btnStart.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MainMenu.this, MainActivity.class);
            MainMenu.this.startActivity(intent);
        }
    });
}

private void createBtnFbLogin() {
    btnLogin.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if(fb.isSessionValid()) {
                try {
                    fb.logout(MainMenu.this);
                    updateFbButtonImage();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            else {
                fb.authorize(MainMenu.this, new DialogListener() {

                    @Override
                    public void onFacebookError(FacebookError e) {
                        Toast.makeText(MainMenu.this, "onFacebookError", Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onError(DialogError e) {
                        Toast.makeText(MainMenu.this, "onError", Toast.LENGTH_SHORT).show();                            
                    }

                    @Override
                    public void onComplete(Bundle values) {
                        /*
                        Editor editor = shared_pref.edit();
                        editor.putString("access_token", fb.getAccessToken());
                        editor.putLong("access_expires", fb.getAccessExpires());
                        editor.commit(); */
                        updateFbButtonImage();                          
                    }

                    @Override
                    public void onCancel() {
                        Toast.makeText(MainMenu.this, "onCancel", Toast.LENGTH_SHORT).show();                           
                    }
                });
            }
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    fb.authorizeCallback(requestCode, resultCode, data);
}

private void updateFbButtonImage() {
    if(fb.isSessionValid()) {
        btnLogin.setImageResource(R.drawable.logout_button);
    }
    else {
        btnLogin.setImageResource(R.drawable.login_button);
    }
}

private void createBtnSettings() {
    Button btnSettings = (Button) findViewById(R.id.buttonStatistics);
    btnSettings.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MainMenu.this, Statistics.class);
            MainMenu.this.startActivity(intent);
        }
    });
}

public void popQuitDialog() {
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainMenu.this);

    alertDialog.setTitle("Do you really want to quit?");
    alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();
        }
    });

    alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });

    alertDialog.show();
}

}

これはスタックトレースです(Android 4.0.4で実行しています):

 01-25 19:09:06.028: D/dalvikvm(23201): GC_FOR_ALLOC freed 50K, 7% free 12768K/13663K, paused 23ms
01-25 19:09:06.088: I/dalvikvm-heap(23201): Grow heap (frag case) to 21.362MB for 9216016-byte allocation
01-25 19:09:06.118: D/dalvikvm(23201): GC_FOR_ALLOC freed <1K, 5% free 21767K/22691K, paused 15ms
01-25 19:09:06.168: D/dalvikvm(23201): GC_CONCURRENT freed 1K, 5% free 21766K/22691K, paused 2ms+2ms
01-25 19:09:06.248: D/dalvikvm(23201): GC_FOR_ALLOC freed <1K, 5% free 21766K/22691K, paused 12ms
01-25 19:09:06.368: I/dalvikvm-heap(23201): Grow heap (frag case) to 36.985MB for 16384016-byte allocation
01-25 19:09:06.398: D/dalvikvm(23201): GC_FOR_ALLOC freed 0K, 3% free 37766K/38755K, paused 19ms
01-25 19:09:06.448: D/dalvikvm(23201): GC_CONCURRENT freed 0K, 3% free 37767K/38755K, paused 2ms+3ms
01-25 19:09:06.558: D/TextLayoutCache(23201): Using debug level: 0 - Debug Enabled: 0
01-25 19:09:06.568: D/libEGL(23201): loaded /system/lib/egl/libGLES_android.so
01-25 19:09:06.568: D/libEGL(23201): loaded /system/lib/egl/libEGL_adreno200.so
01-25 19:09:06.578: D/libEGL(23201): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
01-25 19:09:06.588: D/libEGL(23201): loaded /system/lib/egl/libGLESv2_adreno200.so
01-25 19:09:06.598: I/Adreno200-EGLSUB(23201): <ConfigWindowMatch:2078>: Format RGBA_8888.
01-25 19:09:06.618: D/memalloc(23201): /dev/pmem: Mapped buffer base:0x5c6c6000 size:21016576 offset:17248256 fd:64
01-25 19:09:06.618: E/(23201): Can't open file for reading
01-25 19:09:06.618: E/(23201): Can't open file for reading
01-25 19:09:06.628: D/OpenGLRenderer(23201): Enabling debug mode 0
01-25 19:09:06.818: D/memalloc(23201): /dev/pmem: Mapped buffer base:0x5ee47000 size:11022336 offset:7254016 fd:67
01-25 19:09:09.048: D/memalloc(23201): /dev/pmem: Mapped buffer base:0x5f9d2000 size:7254016 offset:3485696 fd:70
01-25 19:09:09.208: D/OpenGLRenderer(23201): Flushing caches (mode 1)
01-25 19:09:10.038: D/OpenGLRenderer(23201): Flushing caches (mode 0)
01-25 19:09:10.038: D/memalloc(23201): /dev/pmem: Unmapping buffer base:0x5c6c6000 size:21016576 offset:17248256
01-25 19:09:10.038: D/memalloc(23201): /dev/pmem: Unmapping buffer base:0x5ee47000 size:11022336 offset:7254016
01-25 19:09:10.038: D/memalloc(23201): /dev/pmem: Unmapping buffer base:0x5f9d2000 size:7254016 offset:3485696
01-25 19:09:16.588: I/Adreno200-EGLSUB(23201): <ConfigWindowMatch:2078>: Format RGBA_8888.
01-25 19:09:16.598: D/memalloc(23201): /dev/pmem: Mapped buffer base:0x5c6c6000 size:7254016 offset:3485696 fd:64
01-25 19:09:16.738: D/memalloc(23201): /dev/pmem: Mapped buffer base:0x5ceb1000 size:11563008 offset:7794688 fd:67
01-25 19:09:18.498: D/memalloc(23201): /dev/pmem: Mapped buffer base:0x600ce000 size:21016576 offset:17248256 fd:70
01-25 19:09:18.578: D/Facebook-Util(23201): GET URL: https://api.facebook.com/restserver.php?access_token=BAAHxNZCKUYeABAOumBne8GijZA3qZAUimZBQVsGu19qjSfRXIWBSy5t5WpsT3SV4GmqSFFZAdOWpmu7SJrH51V245ZBHh1RMMQybkpP2OH7GRDGMNAgc0Fudaztq07ZCVRMbcHb14nfYAZDZD&method=auth.expireSession&format=json
01-25 19:09:18.578: D/AndroidRuntime(23201): Shutting down VM
01-25 19:09:18.578: W/dalvikvm(23201): threadid=1: thread exiting with uncaught exception (group=0x40a9f210)
01-25 19:09:18.608: E/AndroidRuntime(23201): FATAL EXCEPTION: main
01-25 19:09:18.608: E/AndroidRuntime(23201): android.os.NetworkOnMainThreadException
01-25 19:09:18.608: E/AndroidRuntime(23201):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1108)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.io.IoBridge.connectErrno(IoBridge.java:133)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.io.IoBridge.connect(IoBridge.java:118)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at java.net.Socket.connect(Socket.java:849)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:117)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at com.facebook.android.Util.openUrl(Util.java:219)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at com.facebook.android.Facebook.requestImpl(Facebook.java:806)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at com.facebook.android.Facebook.request(Facebook.java:709)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at com.facebook.android.Facebook.logoutImpl(Facebook.java:651)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at com.facebook.android.Facebook.logout(Facebook.java:644)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at taxi.route.MainMenu$3.onClick(MainMenu.java:93)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at android.view.View.performClick(View.java:3574)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at android.view.View$PerformClick.run(View.java:14293)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at android.os.Handler.handleCallback(Handler.java:605)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at android.os.Looper.loop(Looper.java:137)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at android.app.ActivityThread.main(ActivityThread.java:4441)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at java.lang.reflect.Method.invokeNative(Native Method)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at java.lang.reflect.Method.invoke(Method.java:511)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
01-25 19:09:18.608: E/AndroidRuntime(23201):    at dalvik.system.NativeStart.main(Native Method)
01-25 19:09:22.068: I/Process(23201): Sending signal. PID: 23201 SIG: 9

また、コメントされたコードは、ユーザーが自動的にログインしようとするコードですが、意図したとおりに機能せず、解決策も見つかりません。それについて新しい質問をする必要があるかどうかわからないので、アドバイスをいただければ幸いです。


これは私がこれを MainMenu.java に追加したものです

private class PostTask extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... params) {
        try {
            fb.logout(MainMenu.this);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

そして、コメントを次のように置き換えます

//fb.logout(MainMenu.this);
  new PostTask().doInBackground();
4

1 に答える 1

1

NetworkOnMainThreadExceptionスタック トレースで示されているように取得しています。Android バージョン 3.0 以降では、メイン (ネイティブ スレッド) でのネットワーク操作を許可しない新しい StrictMode があるため、これが発生します。AsyncTaskを使用してネットワーク処理を行うことを検討してください。

以下は AsyncTask の例です。これは 2 つの基本的な部分で構成されています。doInBackground()のスレッドでネットワーク処理を行い、その結果を に渡します。この 2 番目の方法では、UI に必要な変更を加えます。例のメモのように、メソッドを実行する前に何かをしたい場合は、 を使用します。onPostExecute()doInBackground()onPreExecute()

また、興味深い読み物: Keeping Your App Responsive . また、AsyncTask の例も提供します。

于 2013-01-25T17:28:35.923 に答える