2012-12-16 4 views
-1

facebook SDK 라이브러리를 가져 오면 코드는 작동하지만 (지금은 사용되지 않는 메소드는 무시) 오류 또는 경고가 없습니다.내 코드에 오류가 없더라도 Facebook android 앱은 계속 충돌합니다. 왜?

그러나 Android 2.2 또는 4.2 에뮬레이터에서 내 Facebook 앱을 실행하면 로그온 화면을 열거 나 로그 아웃 한 후 앱이 충돌합니다. 왜?

비동기 작업을 구현하지 않기 때문입니까? 그렇다면 어떻게 작동합니까?

package com.sara.facebookappl; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import org.json.JSONException; 
import org.json.JSONObject; 


import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 
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; 
import com.facebook.android.Util; 

public class MainActivity extends Activity implements OnClickListener, DialogListener { 

    Facebook fb; 
    ImageView button; 
    SharedPreferences sp; 
    TextView welcome; 
    Button post; 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      post=(Button)findViewById(R.id.button1); 

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

      sp =getPreferences(MODE_PRIVATE); 
      String access_token=sp.getString("access_token", null); 
      long expires=sp.getLong("access_expires", 0); 

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


      button=(ImageView)findViewById(R.id.login); 
      button.setOnClickListener((OnClickListener) this); 
      updateButtonImage(); 

    } 

    @SuppressWarnings("deprecation") 
    private void updateButtonImage() { 
      // TODO Auto-generated method stub 

      post.setVisibility(Button.VISIBLE); 
      button.setImageResource(R.drawable.com_facebook_loginbutton_blue); 
      //logout button 

      if (fb.isSessionValid()) { 
        button.setImageResource(R.drawable.com_facebook_loginbutton_blue); 
        // ^logout button 

      JSONObject obj=null; 
      URL img_url =null; 

      try { 
      String jsonUser= fb.request("me"); 
      obj = Util.parseJson(jsonUser); 
      String id=obj.optString("id"); 
      String name = obj.optString("name"); 
      welcome.setText("Welcome, " + name); 
      }catch(FacebookError e) { 
        e.printStackTrace(); 

      }catch (JSONException e) { 
        e.printStackTrace(); 
      }catch (MalformedURLException e) { 
        e.printStackTrace(); 
      }catch (IOException e) { 
        e.printStackTrace(); 
      } 

      }else { 
        post.setVisibility(Button.VISIBLE); 
        button.setImageResource(R.drawable.com_facebook_loginbutton_blue); 
      } 
    } 

    @SuppressWarnings("deprecation") 
    public void buttonClicks(View v) { 
      switch (v.getId()) { 
        case R.id.button1: 
          //post 

          Bundle params= new Bundle(); 

          params.putString("name", "User X"); 
          params.putString("caption", "Rating"); 
          params.putString("description", "User X Rated"); 
          params.putString("link", "http://..."); 



          fb.dialog(MainActivity.this, "feed", params, new Facebook.DialogListener() { 

            @Override 
            public void onFacebookError(FacebookError e) { 
              // TODO Auto-generated method stub 

            } 

            @Override 
            public void onError(DialogError e) { 
              // TODO Auto-generated method stub 

            } 

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

            } 

            @Override 
            public void onCancel() { 
              // TODO Auto-generated method stub 

            } 
          }); 
          break; 
      } 
    } 
    @SuppressWarnings("deprecation") 
    public void onClick(View v) { 
      if(fb.isSessionValid()) { 

        try { 
        fb.logout(getApplicationContext()); 
        updateButtonImage(); 
        //button will close our our session 
      }catch(MalformedURLException e) { 
        e.printStackTrace(); 
      } catch(IOException e) { 
        e.printStackTrace(); 
      } 
    }else{ 
        //login into facebook 
        fb.authorize(MainActivity.this, new String[] {"email"}, new Facebook.DialogListener() { 

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

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

          @Override 
          public void onComplete(Bundle values) { 
            // TODO Auto-generated method stub 
            Editor editor=sp.edit(); 
            editor.putString("access_token", fb.getAccessToken()); 
            editor.putLong("access_expires", fb.getAccessExpires()); 
            editor.commit(); 
            updateButtonImage(); 
          } 

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

        } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.activity_main, menu); 
      return true; 
    } 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      fb.authorizeCallback(requestCode, resultCode, data); 
    } 

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

    } 

    @Override 
    public void onFacebookError(FacebookError e) { 
      // TODO Auto-generated method stub 

    } 

    @Override 
    public void onError(DialogError e) { 
      // TODO Auto-generated method stub 

    } 

    @Override 
    public void onCancel() { 
      // TODO Auto-generated method stub 

    } 

} 

로그 캣 오류 : 내가 비동기 작업을 실행하고 있지 않다 있기 때문에

12-16 04:56:59.070: E/AndroidRuntime(822): FATAL EXCEPTION: main 
12-16 04:56:59.070: E/AndroidRuntime(822): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sara.facebookappl/com.sara.facebookappl.MainActivity}: android.os.NetworkOnMainThreadException 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.os.Looper.loop(Looper.java:137) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.ActivityThread.main(ActivityThread.java:5039) 
12-16 04:56:59.070: E/AndroidRuntime(822): at java.lang.reflect.Method.invokeNative(Native Method) 
12-16 04:56:59.070: E/AndroidRuntime(822): at java.lang.reflect.Method.invoke(Method.java:511) 
12-16 04:56:59.070: E/AndroidRuntime(822): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-16 04:56:59.070: E/AndroidRuntime(822): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-16 04:56:59.070: E/AndroidRuntime(822): at dalvik.system.NativeStart.main(Native Method) 
12-16 04:56:59.070: E/AndroidRuntime(822): Caused by: android.os.NetworkOnMainThreadException 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
12-16 04:56:59.070: E/AndroidRuntime(822): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
12-16 04:56:59.070: E/AndroidRuntime(822): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
12-16 04:56:59.070: E/AndroidRuntime(822): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 
12-16 04:56:59.070: E/AndroidRuntime(822): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271) 
12-16 04:56:59.070: E/AndroidRuntime(822): at com.facebook.android.Util.openUrl(Util.java:219) 
12-16 04:56:59.070: E/AndroidRuntime(822): at com.facebook.android.Facebook.requestImpl(Facebook.java:806) 
12-16 04:56:59.070: E/AndroidRuntime(822): at com.facebook.android.Facebook.request(Facebook.java:732) 
12-16 04:56:59.070: E/AndroidRuntime(822): at com.sara.facebookappl.MainActivity.updateButtonImage(MainActivity.java:83) 
12-16 04:56:59.070: E/AndroidRuntime(822): at com.sara.facebookappl.MainActivity.onCreate(MainActivity.java:63) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.Activity.performCreate(Activity.java:5104) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
12-16 04:56:59.070: E/AndroidRuntime(822): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
12-16 04:56:59.070: E/AndroidRuntime(822): ... 11 more 
12-16 04:56:59.090: D/dalvikvm(822): GC_CONCURRENT freed 150K, 9% free 2723K/2988K, paused 7ms+58ms, total 239ms 
+6

LogCat 오류를 게시하십시오. 컴파일 시간과 런타임 오류 사이에 차이가 있다는 것을 알기 때문에 컴파일러는 존재할 수있는 모든 오류에 대해 경고 할 수 없습니다. – Sam

+0

죄송합니다. 위를 확인하십시오. 그리고 사전에 글꼴 크기에 대해 사과드립니다 ... 그게 얼마나 큰지 잘 모르겠습니다. –

+0

로그캣 오류가 추가되었습니다. 다시 한 번 감사 드리며 큰 글꼴 크기에 대해 사과드립니다. 작은 글꼴로 다시 만드는 방법을 모릅니다. –

답변

0

여기 내 코드입니까?

예. LogCat을보고 가장 낮은 "원인"을 찾으십시오.이 경우에는 NetworkOnMainThreadException입니다. documentation 읽기 :

응용 프로그램이 주 스레드에서 네트워킹 작업을 수행하려고 할 때 throw되는 예외입니다. ... Designing for Responsiveness 문서를 참조하십시오.

우리가 위쪽 로그 캣의 바닥에서 읽는다면, 당신이 당신의 마지막 실행 코드와 위의 라인이라고 볼 수 있습니다 : 네트워크 작업입니다

at com.facebook.android.Facebook.request(Facebook.java:732) 
    at com.sara.facebookappl.MainActivity.updateButtonImage(MainActivity.java:83) 

라인 (83) 통화 Facebook#request(). ... 사용자 정의 AsyncTask를 다음이 doInBackground() 방법의에 코드를 지원하고있어이 라인과 모든 이동 만듭니다 라인을 제외하고

JSONObject obj=null; 
URL img_url =null; 

try { 
    String jsonUser= fb.request("me"); 
    obj = Util.parseJson(jsonUser); 
    String id = obj.optString("id"); 
    String name = obj.optString("name"); 
}catch (FacebookError e) { 
    e.printStackTrace(); 
}catch (JSONException e) { 
    e.printStackTrace(); 
}catch (MalformedURLException e) { 
    e.printStackTrace(); 
}catch (IOException e) { 
    e.printStackTrace(); 
} 

을 01,. 텍스트 뷰와 같은 UI 개체는 doInBackground()에 액세스 할 수 없습니다. 이 코드를 onPostExecute()에 넣어야합니다. AsyncTask 문서를 읽으면 UI 스레드에 액세스 할 수 있다는 것을 알게됩니다.

약간의 독서와 약간의 시도 후에, 그것은 그렇게 나쁘지는 않다는 것을 알게 될 것입니다. 당신이 꼼짝 못하게하는 경우에 당신을 돕는 수많은보기가있다. 행운을 빕니다!

관련 문제