added facebook SDK now unable to resume activity force close
Asked Answered
S

5

9

My activity is throwing this error on crash:

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)

My code for the activity is:

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 gave me these instructions in order to track install. The error points out I seem to be missing some arguments, did the instructions miss something:

enter image description here

Shipboard answered 11/3, 2015 at 23:5 Comment(1)
Since today the answer is not quite correct. See answer here: https://mcmap.net/q/273086/-android-facebook-applicationid-cannot-be-nullScriber
L
25

Have you set meta-data applicationId in your AndroidManifest.xml under application tag yet?

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

And also don't forget to define app_id string resource in your strings.xml as well.

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

For more information, https://developers.facebook.com/docs/android/getting-started

Listed answered 11/3, 2015 at 23:12 Comment(4)
Don't know why Facebook didn't mentioned this meta data issue on their Quick Start sectionPolyphemus
It does, but the documentation is totally a mess: developers.facebook.com/docs/android/getting-startedDisplayed
This one is also important: developers.facebook.com/docs/reference/android/current/class/…Displayed
This solution isn't working for me(I am doing Facebook Login).Can someone help me please?Shayne
I
3

Facebook's quick start guide is currently wrong. They are missing a few critical steps:

  • Initialize the SDK
  • Store the app ID

Specifically, you need to add this to your activity where you want to use the AppEventsLogger.activateApp(this):

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

And you need to store the app ID:

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

And the strings.xml value:

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

Annoying that their Quick Start guide actually causes more issues than it solves right now!

Infatuated answered 28/5, 2015 at 18:30 Comment(3)
The documentation says that FacebookSdk.sdkInitialize(getApplicationContext()); and AppEventsLogger.activateApp(this); go to your Application onCreate(). See the documentation: developers.facebook.com/docs/android/getting-startedFannyfanon
@AlbertVila They must have updated it then since this was a year ago. Awesome!Infatuated
Yes. Now the setup it's simpler. And the docs are very clear :)Fannyfanon
W
1

In case somebody has this problem too, for me this was corrected by using: AppEventsLogger.activateApp(context,ID), i.e. AppEventsLogger.activateApp(this,"your-fb-id"). The id declared as string was used by Manifest, but give me problems in the activity, considering that this value was empty.

Wiedmann answered 26/5, 2016 at 11:4 Comment(0)
S
1

I am using Facebook SDK v4.13. I needed to do the following changes to track application install and analytics.

AndroidManifest.xml

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

SDK seems to pool the activity in a local file. So this permission is a must if you have not given yet.

I load the Application Id in the code

AppEventsLogger.activateApp(this, Constants.FACEBOOK_APP_ID);
Stoss answered 17/6, 2016 at 11:36 Comment(0)
B
0

Simple, add in your Activity this method

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

    callbackManager.onActivityResult(requestCode, resultCode, data);
}
Breakout answered 30/5, 2017 at 23:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.