0

Facebook SDK (v3.6)를 사용하는 작은 앱을 만들고 있습니다. 많은 노력 끝에 FBLoginActivity (부모 MainActivity)라는 액티비티를 만들었습니다.이 액티비티는 Facebook SDK의 샘플 (즉, Scrumptious)에서 빌린 코드를 사용합니다. FBLoginActivity (기본적으로 Scrumptious의 로그인 페이지와 비슷하며 사용자를 인증하고 세션 제어를위한 LoginButton을가집니다)에 이르는 주요 활동에 버튼이 있습니다.Facebook 로그인 활동을 사용할 수 없습니다.

그러나 앱을 실행하고 버튼을 클릭하면 앱이 다운됩니다. 페이스 북 SDK를 내 작업 공간에 가져 왔고 모든 코드가 잘 빌드됩니다. Facebook 개발자 페이지에서 내 앱에 Android 용 새 플랫폼을 추가하고 아래 필드를 표시했습니다.

패키지 이름 : com.example.myfbapp 클래스 이름 : 다음과 같아야할지 잘 모르겠습니다. com .example.insultdroid.MainActivity 또는 com.example.insultdroid.FBLoginActivity; 나는 두 가지 옵션으로 작업을 시도했다.

또한 내 매니페스트에 필요한 권한과 앱 ID를 추가했습니다.

개발자 안내서에 표시된 것처럼 keyhash를 성공적으로 생성하고 "Single Sign On"옵션을 Yes로 설정했습니다. 내가 어디로 잘못 가고 있니? 내가 놓친 게 있니? FBLoginActivity가로드되지 않는 이유는 무엇입니까? 아래

는 FBLoginActivity에 대한 코드입니다

package com.example.myfbapp; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.view.Menu; 
import android.view.MenuItem; 

import com.facebook.AppEventsLogger; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.UiLifecycleHelper; 


public class FBLoginActivity extends FragmentActivity { 

    private static final String USER_SKIPPED_LOGIN_KEY = "user_skipped_login"; 

    private static final int SPLASH = 0; 
    private static final int SELECTION = 1; 
    private static final int SETTINGS = 2; 
    private static final int FRAGMENT_COUNT = SETTINGS +1; 

    private Fragment[] fragments = new Fragment[FRAGMENT_COUNT]; 
    private MenuItem settings; 
    private boolean isResumed = false; 
    private boolean userSkippedLogin = false; 
    private UiLifecycleHelper uiHelper; 
    private Session.StatusCallback callback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      onSessionStateChange(session, state, exception); 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState != null) { 
      userSkippedLogin = savedInstanceState.getBoolean(USER_SKIPPED_LOGIN_KEY); 
     } 
     uiHelper = new UiLifecycleHelper(this, callback); 
     uiHelper.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_fblogin); 

     FragmentManager fm = getSupportFragmentManager(); 
     SplashFragment splashFragment = (SplashFragment) fm.findFragmentById(R.id.splashFragment); 
     fragments[SPLASH] = splashFragment; 
     fragments[SELECTION] = fm.findFragmentById(R.id.selectionFragment); 
     //fragments[SETTINGS] = fm.findFragmentById(R.id.userSettingsFragment); 

     FragmentTransaction transaction = fm.beginTransaction(); 
     for(int i = 0; i < fragments.length; i++) { 
      transaction.hide(fragments[i]); 
     } 
     transaction.commit(); 

     splashFragment.setSkipLoginCallback(new SplashFragment.SkipLoginCallback() { 
      @Override 
      public void onSkipLoginPressed() { 
       userSkippedLogin = true; 
       showFragment(SELECTION, false); 
      } 
     }); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     uiHelper.onResume(); 
     isResumed = true; 

     // Call the 'activateApp' method to log an app event for use in analytics and advertising reporting. Do so in 
     // the onResume methods of the primary Activities that an app may be launched into. 
     AppEventsLogger.activateApp(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     uiHelper.onPause(); 
     isResumed = false; 
    } 

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

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     uiHelper.onDestroy(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     uiHelper.onSaveInstanceState(outState); 

     outState.putBoolean(USER_SKIPPED_LOGIN_KEY, userSkippedLogin); 
    } 

    @Override 
    protected void onResumeFragments() { 
     super.onResumeFragments(); 
     Session session = Session.getActiveSession(); 

     if (session != null && session.isOpened()) { 
      // if the session is already open, try to show the selection fragment 
      showFragment(SELECTION, false); 
      userSkippedLogin = false; 
     } else if (userSkippedLogin) { 
      showFragment(SELECTION, false); 
     } else { 
      // otherwise present the splash screen and ask the user to login, unless the user explicitly skipped. 
      showFragment(SPLASH, false); 
     } 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // only add the menu when the selection fragment is showing 
     if (fragments[SELECTION].isVisible()) { 
      if (menu.size() == 0) { 
       settings = menu.add(R.string.settings); 
      } 
      return true; 
     } else { 
      menu.clear(); 
      settings = null; 
     } 
     return false; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (item.equals(settings)) { 
      showSettingsFragment(); 
      return true; 
     } 
     return false; 
    } 

    public void showSettingsFragment() { 
     showFragment(SETTINGS, true); 
    } 

    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     if (isResumed) { 
      FragmentManager manager = getSupportFragmentManager(); 
      int backStackSize = manager.getBackStackEntryCount(); 
      for (int i = 0; i < backStackSize; i++) { 
       manager.popBackStack(); 
      } 
      // check for the OPENED state instead of session.isOpened() since for the 
      // OPENED_TOKEN_UPDATED state, the selection fragment should already be showing. 
      if (state.equals(SessionState.OPENED)) { 
       showFragment(SELECTION, false); 
      } else if (state.isClosed()) { 
       showFragment(SPLASH, false); 
      } 
     } 
    } 

    private void showFragment(int fragmentIndex, boolean addToBackStack) { 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction transaction = fm.beginTransaction(); 
     for (int i = 0; i < fragments.length; i++) { 
      if (i == fragmentIndex) { 
       transaction.show(fragments[i]); 
      } else { 
       transaction.hide(fragments[i]); 
      } 
     } 
     if (addToBackStack) { 
      transaction.addToBackStack(null); 
     } 
     transaction.commit(); 
    } 
} 

그리고 이것은 좀 도와주세요 AndroidManifest.xml을

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

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

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


    <application 
     android:allowBackup="true" 
     android:icon="@drawable/angry_android" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.myfbapp.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> 
     <activity 
      android:name="com.example.myfbapp.FavLogActivity" 
      android:label="@string/title_activity_fav_log" > 
     </activity> 
     <activity 
      android:name="com.example.myfbapp.FBLoginActivity" 
      android:label="@string/title_activity_fblogin" 
      android:parentActivityName="com.example.myfbapp.MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.example.myfbapp.MainActivity" /> 
     </activity> 
     <meta-data android:name="com.example.myfbapp.ApplicationId" android:value="@string/app_id"/> 
    </application> 

</manifest> 

입니다! 이것은 오류입니다. 로그캣 :

01-12 17:34:35.478: D/dalvikvm(7010): GC_FOR_ALLOC freed 68K, 2% free 9090K/9196K, paused 23ms, total 23ms 
01-12 17:34:35.518: I/dalvikvm-heap(7010): Grow heap (frag case) to 24.726MB for 16588816-byte allocation 
01-12 17:34:35.538: D/dalvikvm(7010): GC_FOR_ALLOC freed 1K, 1% free 25289K/25400K, paused 18ms, total 18ms 
01-12 17:34:35.808: I/TextToSpeech(7010): Sucessfully bound to com.google.android.tts 
01-12 17:34:35.848: I/Adreno-EGL(7010): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13 
01-12 17:34:35.878: D/OpenGLRenderer(7010): Enabling debug mode 0 
01-12 17:34:38.381: D/AndroidRuntime(7010): Shutting down VM 
01-12 17:34:38.381: W/dalvikvm(7010): threadid=1: thread exiting with uncaught exception (group=0x415ccba8) 
01-12 17:34:38.381: E/AndroidRuntime(7010): FATAL EXCEPTION: main 
01-12 17:34:38.381: E/AndroidRuntime(7010): Process: com.example.myfbapp, PID: 7010 
01-12 17:34:38.381: E/AndroidRuntime(7010): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfbapp/com.example.myfbapp.FBLoginActivity}: java.lang.NullPointerException: Argument 'applicationId' cannot be null 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.ActivityThread.access$800(ActivityThread.java:135) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.os.Handler.dispatchMessage(Handler.java:102) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.os.Looper.loop(Looper.java:136) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at java.lang.reflect.Method.invoke(Method.java:515) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at dalvik.system.NativeStart.main(Native Method) 
01-12 17:34:38.381: E/AndroidRuntime(7010): Caused by: java.lang.NullPointerException: Argument 'applicationId' cannot be null 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at com.facebook.internal.Validate.notNull(Validate.java:29) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at com.facebook.Session.<init>(Session.java:227) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at com.facebook.Session.<init>(Session.java:212) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at com.facebook.UiLifecycleHelper.onCreate(UiLifecycleHelper.java:87) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at com.example.myfbapp.FBLoginActivity.onCreate(FBLoginActivity.java:48) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.Activity.performCreate(Activity.java:5231) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
01-12 17:34:38.381: E/AndroidRuntime(7010):  ... 11 more 
01-12 17:34:40.713: I/Process(7010): Sending signal. PID: 7010 SIG: 9 

희망이 있습니다.

필자는 Scrumptious의 매니페스트에서이 코드를 이해하지 못합니다. 내 명단에이 코드가 없습니다. 그것은 무엇이며 필요한 것입니까?

<provider android:authorities="com.facebook.app.NativeAppCallContentProvider233936543368280" 
        android:name="com.facebook.NativeAppCallContentProvider" /> 

"233936543368280"은 Scrumptious의 appid입니다.

+0

는 u는 오류 로그 캣을 게시 할 수 있습니까? – Frank

+0

logcat 오류가 추가되었습니다. 그게 도움이 되니? –

+0

check applpicaqtion id 발생 원인 : java.lang.NullPointerException : 'applicationId'인수가 null 일 수 없음 – Frank

답변

1

변경이 매니페스트 응용 프로그램 ID :

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

아, 시도 할 것입니다! 내 패키지 이름이어야한다고 생각 했어. 또한 개발자 페이지의 클래스 이름에 대한 내 질문에 대답 할 수 있습니까? –

+0

dev 페이지의 클래스 이름은 먼저 facebook API – Frank

+0

을 호출하는 클래스 여야하므로 MainActivity에 FBLoginActivity 클래스를 호출하는 버튼이 있습니다. 모든 Facebook SDK 호출을하는 것은이 클래스입니다. 그래서 그것은 dev 페이지에서 언급되어야하는이 클래스일까요? –

관련 문제