1

Facebookからアプリにログインしたユーザーの情報を取得するために、Androidで簡単なアプリを作成しています。これが私のコードです:

public class example extends Activity {

Facebook facebook = new Facebook("id");
AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);

private static final String TAG ="Debug";
private SharedPreferences mPrefs;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_example);
    /*
     * Get existing access_token if any
     */
    mPrefs = getPreferences(MODE_PRIVATE);
    String access_token = mPrefs.getString("access_token", null);
    long expires = mPrefs.getLong("access_expires", 0);
    if(access_token != null) {
        facebook.setAccessToken(access_token);
    }
    if(expires != 0) {
        facebook.setAccessExpires(expires);
    }

    /*
     * Only call authorize if the access_token has expired.
     */
    if(!facebook.isSessionValid()) {

        facebook.authorize(this, new String[] {"publish_stream","email","user_groups","read_stream","user_about_me","offline_access"}, new DialogListener() {
            @Override
            public void onComplete(Bundle values) {
                SharedPreferences.Editor editor = mPrefs.edit();
                editor.putString("access_token", facebook.getAccessToken());
                editor.putLong("access_expires", facebook.getAccessExpires());
                editor.commit();
            }

            @Override
            public void onFacebookError(FacebookError error) {}

            @Override
            public void onError(DialogError e) {}

            @Override
            public void onCancel() {}
        });
    }        
    Log.d(TAG, access_token);
    getInformation();
}

private void getInformation(){

    JSONObject json = null;

    try
    {
        Log.d("testing", "point1");
        String response = facebook.request("me");
        Log.d("testing", "point2");
        json = Util.parseJson(response);
        String id = json.getString("id");
        Log.d("testing", id);
    }
    catch (MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (FacebookError e)
    {
        e.printStackTrace();
    }

}

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

    facebook.authorizeCallback(requestCode, resultCode, data);
}

@Override
public void onResume() {    
    super.onResume();
    facebook.extendAccessTokenIfNeeded(this, null);
}
}

ここhttps://developers.facebook.com/docs/mobile/android/build/#sdkをフォローし、同じfacebookSDKを使用します。したがって、コードに示されているように、logcatにはpoint1のみがあり、point2はありません。これは、facebook.request( "me")が成功しないことを意味します。エミュレーターはアプリがシャットダウンしたことを示し、「残念ながら、例は停止しました」と言います。

だから誰かが私が質問を指摘するのを手伝ってくれる?アクセストークンに何か問題があるのではないかと思いますが、それについてはわかりません。どうもありがとう。

LogCat:

11-03 10:13:55.986: D/Debug(893): AAAFi20EvlJEBACwBLIR4buSOaZB1emxACFPZCZAKums6ZCNwZB0wZCvQnI3grshT0YNl8ZC427BSkrNye6akdCZBjvp4KL24Oyx......
11-03 10:13:55.986: D/testing(893): point1
11-03 10:13:56.106: D/AndroidRuntime(893): Shutting down VM
11-03 10:13:56.106: W/dalvikvm(893): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
11-03 10:13:56.136: E/AndroidRuntime(893): FATAL EXCEPTION: main
11-03 10:13:56.136: E/AndroidRuntime(893): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.crush/com.example.crush.Crush}: android.os.NetworkOnMainThreadException
11-03 10:13:56.136: E/AndroidRuntime(893):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
4

1 に答える 1

1

メインスレッドでネットワーク操作を実行しています。非同期タスクを使用して、バックグラウンド スレッドでネットワーク操作を実行します (バックグラウンド スレッドで http 要求を実行します)。そのため、android.os.NetworkOnMainThreadException が発生しています。

次のような非同期タスクでネットワークを実行します。

class FacebookRequestTask extends AsyncTask{


    protected void onPreExecute() {
    //show a progress dialog to the user or something
    }

    protected void doInBackground() {
        //Do your networking here
    }

    protected void onPostExecute() {
        //do something with your parsed 
        //response (JSON data in case of facebook API's) here 
        // and dismiss the progress dialog
    }
  }

  new facebookRequestTask().execute();

非同期タスクの使用方法がわからない場合は、次のチュートリアルを参照してください。

http://mobileorchard.com/android-app-developmentthreading-part-2-async-tasks/

http://www.vogella.com/articles/AndroidPerformance/article.html

Google の公式ドキュメントは次のとおりです。

https://developer.android.com/reference/android/os/AsyncTask.html

于 2012-11-03T10:41:12.213 に答える