9

Моя деятельность бросает эту ошибку на аварии:добавил facebook SDK Теперь не в состоянии возобновить деятельность силы близко

java.lang.RuntimeException: Unable to resume activity {com.beerportfolio.beerportfoliopro/com.example.mike.beerportfoliomaterial.MainDrawer2}: java.lang.IllegalArgumentException: Both context and applicationId must be non-null 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3069) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3098) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2469) 
     at android.app.ActivityThread.access$900(ActivityThread.java:172) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:146) 
     at android.app.ActivityThread.main(ActivityThread.java:5653) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: java.lang.IllegalArgumentException: Both context and applicationId must be non-null 
     at com.facebook.AppEventsLogger.activateApp(AppEventsLogger.java:273) 
     at com.facebook.AppEventsLogger.activateApp(AppEventsLogger.java:260) 
     at com.example.mike.beerportfoliomaterial.MainDrawer2.onResume(MainDrawer2.java:179) 
     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1198) 
     at android.app.Activity.performResume(Activity.java:5618) 
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3059) 
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3098) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2469) 
     at android.app.ActivityThread.access$900(ActivityThread.java:172) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:146) 
     at android.app.ActivityThread.main(ActivityThread.java:5653) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
     at dalvik.system.NativeStart.main(NativeStart.java) 

Мой код деятельности:

import android.IntentIntegrator; 
import android.IntentResult; 
import android.annotation.TargetApi; 
import android.app.SearchManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.ActionBarDrawerToggle; 
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.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.SearchView; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.Toast; 
import com.facebook.Session; 

import com.facebook.AppEventsLogger; 


/** 
* Created by Mike and Simon on 2/22/14. 
*/ 
public class MainDrawer2 extends ActionBarActivity 
{ 
    private static final String EXTRA_NAV_ITEM = "extraNavItem"; 
    private static final String STATE_CURRENT_NAV = "stateCurrentNav"; 

    private ActionBarDrawerToggle mDrawerToggle; 
    private DrawerLayout mDrawerLayout; 


    private NavDrawerListAdapter mDrawerAdapter; 
    private ListView mDrawerList; 

    private CharSequence mTitle; 
    private CharSequence mDrawerTitle; 

    private MainNavItem mCurrentNavItem; 


    public static Intent createLaunchFragmentIntent(Context context, MainNavItem navItem) 
    { 
     return new Intent(context, MainDrawer2.class) 
       .putExtra(EXTRA_NAV_ITEM, navItem.ordinal()); 
    } 



    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_main); 



     //Crashlytics.start(this); 

     mTitle = mDrawerTitle = getTitle(); 
     mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView)findViewById(R.id.drawer); 

     // Set a toolbar to replace the action bar. 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     toolbar.setTitleTextColor(0xFFFFFFFF); 

     setSupportActionBar(toolbar); 

     //getActionBar().setDisplayHomeAsUpEnabled(true); 
     //enableHomeButtonIfRequired(); 

     mDrawerAdapter = new NavDrawerListAdapter(getApplicationContext()); 
     mDrawerList.setAdapter(mDrawerAdapter); 
     mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener() 
     { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       displayNavFragment((MainNavItem)parent.getItemAtPosition(position)); 

       if(mDrawerLayout.isDrawerOpen(mDrawerList)) { 
        mDrawerLayout.closeDrawer(mDrawerList); 

       } 
       else { 
        mDrawerLayout.openDrawer(mDrawerList); 
       } 
      } 
     }); 

     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.drawable.ic_menu_white, R.string.app_name, R.string.app_name) 
     { 
      public void onDrawerClosed(View view) 
      { 
       //getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View drawerView) 
      { 
       //getActionBar().setTitle(mDrawerTitle); 
       invalidateOptionsMenu(); 
      } 
     }; 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     if(getIntent().hasExtra(EXTRA_NAV_ITEM)){ 
      MainNavItem navItem = MainNavItem.values() 
        [getIntent().getIntExtra(EXTRA_NAV_ITEM, 
        MainNavItem.STATISTICS.ordinal())]; 
      displayNavFragment(navItem); 
     } 
     else if(savedInstanceState != null){ 
      mCurrentNavItem = MainNavItem.values() 
        [savedInstanceState.getInt(STATE_CURRENT_NAV)]; 
      setCurrentNavItem(mCurrentNavItem); 
     } 
     else{ 
      displayNavFragment(MainNavItem.STATISTICS); 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
    private void enableHomeButtonIfRequired() 
    { 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){ 
      //getActionBar().setHomeButtonEnabled(true); 
     } 
    } 
    public void setActionBarTitle(String title) { 
     //getActionBar().setTitle(title); 
    } 


    @Override 
    public void setTitle(CharSequence title) 
    { 
     mTitle = title; 
     //getActionBar().setTitle(mTitle); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) 
    { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) 
    { 
     super.onConfigurationChanged(newConfig); 
     // Pass any configuration change to the drawer toggles 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Logs 'install' and 'app activate' App Events. 
     AppEventsLogger.activateApp(this); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     // Logs 'app deactivate' App Event. 
     AppEventsLogger.deactivateApp(this); 
    } 

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

     if (mCurrentNavItem == null){ 


     } 
     else{ 
      outState.putInt(STATE_CURRENT_NAV, mCurrentNavItem.ordinal()); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     getMenuInflater().inflate(R.menu.main, menu); 

     return true; 
    } 

    /* 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) 
    { 
     // if nav drawer is opened, hide the action items 
     boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
     menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
     return super.onPrepareOptionsMenu(menu); 
    } 
    */ 



    private void displayNavFragment(MainNavItem navItem) 
    { 
     //if(navItem == mCurrentNavItem){ 
     // return; 
     //} 
     Fragment fragment = Fragment.instantiate(this, 
       navItem.getFragClass().getName()); 
     if(fragment != null){ 

      getSupportFragmentManager().beginTransaction() 
        .replace(R.id.main, fragment) 
        .commit(); 
      //setCurrentNavItem(navItem); 
     } 
    } 

    private void setCurrentNavItem(MainNavItem navItem) 
    { 
     int position = navItem.ordinal(); 
     // If navItem is in DrawerAdapter 

     if(position >= 0 && position < mDrawerAdapter.getCount()){ 
      //mDrawerList.setItemChecked(position, true); 
     } 
     else{ 
      // navItem not in DrawerAdapter, de-select current item 
      if(mCurrentNavItem != null){ 
       //mDrawerList.setItemChecked(mCurrentNavItem.ordinal(), false); 
      } 
     } 

     //test to keep item not selected 
     int toClear=mDrawerList.getCheckedItemPosition(); 

     if (toClear >= 0) { 
      mDrawerList.setItemChecked(toClear, false); 
     } 

     mDrawerLayout.closeDrawer(mDrawerList); 
     //setTitle(navItem.getTitleResId()); 
     mCurrentNavItem = navItem; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 
      case android.R.id.home: 
       if(mDrawerLayout.isDrawerOpen(mDrawerList)) { 
        mDrawerLayout.closeDrawer(mDrawerList); 

       } 
       else { 
        mDrawerLayout.openDrawer(mDrawerList); 
       } 
       return true; 
      default: 

       return super.onOptionsItemSelected(item); 
     } 
    } 




    public void goToSearch(MenuItem item){ 

     //go to search page 
     Fragment Fragment_one; 
     FragmentManager man= getSupportFragmentManager(); 
     FragmentTransaction tran = man.beginTransaction(); 
     Fragment_one = new Search(); 

     tran.replace(R.id.main, Fragment_one);//tran. 
     tran.addToBackStack(null); 
     tran.commit(); 

    } 

    public void scanBarcode(MenuItem item){ 

     //open scanner 
     IntentIntegrator scanIntegrator = new IntentIntegrator(this); 
     scanIntegrator.initiateScan(); 



    } 

    public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

     //retrieve scan result 
     IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); 
     if (scanningResult != null) { 
      //we have a result 

      String scanContent = scanningResult.getContents(); 

      //todo: set scan content into setting, load new fragment which calls async task below. New 
      //todo: fragment will have same ui as search. :-) 
      Fragment Fragment_one; 




      FragmentManager man= this.getSupportFragmentManager(); 
      FragmentTransaction tran = man.beginTransaction(); 
      BarcodeFrag fragmentNew = new BarcodeFrag(); 
      Bundle bundle = new Bundle(); 
      bundle.putString("scanContent", scanContent); 
      fragmentNew.setArguments(bundle); 


      tran.replace(R.id.main, fragmentNew);//tran. 
      tran.addToBackStack(null); 
      //tran.commit(); 
      tran.commitAllowingStateLoss(); 


     } 

     else{ 
      Toast toast = Toast.makeText(getApplicationContext(), 
        "No scan data received!", Toast.LENGTH_SHORT); 
      toast.show(); 
     } 

    } 



} 

Facebook дал мне эти инструкции, чтобы для отслеживания установки. Ошибка указывает на то, я, кажется, отсутствуют некоторые аргументы, даже инструкции пропустить что-то:

enter image description here

+0

С сегодняшнего дня ответ не совсем правильно. См. Ответ здесь: http://stackoverflow.com/a/37870600/2831157 –

ответ

25

Вы установить мета-данные applicationId в вашем AndroidManifest.xml под application теге еще?

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

А также не забудьте определить app_id строку ресурса в strings.xml а.

<string name="app_id">xxxxxxxxxxxx</string> 

Для получения дополнительной информации, https://developers.facebook.com/docs/android/getting-started

+3

Не знаю, почему Facebook не упомянул об этой проблеме метаданных в разделе быстрого старта –

+0

Это так, но документация полностью беспорядочна: https://developers.facebook.com/docs/android/getting-started –

+0

Этот вопрос также важен: https://developers.facebook.com/docs/reference/android/current/class/AppEventsLogger/ –

3

Краткое руководство Facebook в настоящее время не так. Они не хватают несколько важных шагов:

  • Проинициализируема SDK
  • МАГАЗИНА идентификатора приложения

В частности, вам нужно добавить к вашей деятельности, где вы хотите использовать AppEventsLogger.activateApp(this):

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(getApplicationContext()); 
} 

И вам нужно хранить идентификатор приложения:

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

И strings.xml значение:

<string name="facebook_app_id">your_id_here</string> 

Досадно, что их Краткое руководство по эксплуатации на самом деле вызывает больше проблем, чем решает прямо сейчас!

+0

В документации указано, что 'FacebookSdk.sdkInitialize (getApplicationContext());' и 'AppEventsLogger.activateApp (this);' перейдите к вашему ** 'Приложению onCreate()' **. См. Документацию: https://developers.facebook.com/docs/android/getting-started –

+0

@AlbertVila. Они, должно быть, обновили его, так как это было год назад. Потрясающие! –

+0

Да. Теперь настройка проще. И документы очень ясные :) –

1

Если у кого-то тоже есть эта проблема, для меня это было исправлено с помощью: AppEventsLogger.activateApp (контекст, идентификатор), то есть AppEventsLogger.activateApp (это, «ваш-fb-id»). Идентификатор, объявленный как строка, использовался манифестом, но давал мне проблемы в активности, считая, что это значение пусто.

1

Я использую Facebook SDK v4.13. Мне нужно было сделать следующие изменения для отслеживания установки и аналитики приложений.

AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 

SDK, кажется, объединить деятельность в локальном файле. Поэтому это разрешение является обязательным, если вы еще не дали.

загружаю идентификатор приложения в коде

AppEventsLogger.activateApp(this, Constants.FACEBOOK_APP_ID); 
0

Простой, добавить в вашей деятельности этот метод

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

    callbackManager.onActivityResult(requestCode, resultCode, data); 
}