7 Replies Latest reply on Mar 8, 2016 2:46 PM by Bill Hecox

    Error recieveing broadcast Intent when resuming MainActivity

    Micheal Sadleir

      Hi,

       

      I have an app that takes a scan in the MainActivity passed it to an async task that starts a new activity (BroadcastIntentActivity) when it completes. When I finish the data processing in BroadcastIntentActivity I want to resume the MainActivity but I get this error. The code in BroadcastIntentActivity I use to start MainActivity is context.startActivity(new Intent(context, MainActivity.class));

       

          03-02 09:02:59.198    2430-2430/com.example.michealsadleir.emdksamplebase E/AndroidRuntime﹕ FATAL EXCEPTION: main

          Process: com.example.michealsadleir.emdksamplebase, PID: 2430

          java.lang.RuntimeException: Error receiving broadcast Intent { act=com.symbol.emdksample.RECVRBI flg=0x10 (has extras) } in com.example.michealsadleir.emdksamplebase.BroadcastIntentActivity$1@41b5e690

                  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:769)

                  at android.os.Handler.handleCallback(Handler.java:733)

                  at android.os.Handler.dispatchMessage(Handler.java:95)

                  at android.os.Looper.loop(Looper.java:136)

                  at android.app.ActivityThread.main(ActivityThread.java:5045)

                  at java.lang.reflect.Method.invokeNative(Native Method)

                  at java.lang.reflect.Method.invoke(Method.java:515)

                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)

                  at dalvik.system.NativeStart.main(Native Method)

           Caused by: java.lang.NullPointerException

                  at android.content.ComponentName.<init>(ComponentName.java:77)

                  at android.content.Intent.<init>(Intent.java:3838)

                  at com.example.michealsadleir.emdksamplebase.BroadcastIntentActivity.onNoItemsLeft(BroadcastIntentActivity.java:389)

                  at com.example.michealsadleir.emdksamplebase.BroadcastIntentActivity$1.onReceive(BroadcastIntentActivity.java:231)

                  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:759)

                  at android.os.Handler.handleCallback(Handler.java:733)

                  at android.os.Handler.dispatchMessage(Handler.java:95)

                  at android.os.Looper.loop(Looper.java:136)

                  at android.app.ActivityThread.main(ActivityThread.java:5045)

                  at java.lang.reflect.Method.invokeNative(Native Method)

                  at java.lang.reflect.Method.invoke(Method.java:515)

                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)

                  at dalvik.system.NativeStart.main(Native Method)

       

      The MainActivity is below

       

      package com.example.michealsadleir.emdksamplebase;

       

      import android.app.Activity;

      import android.content.Context;

      import android.content.Intent;

      import android.os.AsyncTask;

      import android.os.Bundle;

      import android.util.Log;

      import android.view.View;

      import android.view.View.OnClickListener;

      import android.widget.Button;

      import android.widget.TextView;

       

      import com.symbol.emdk.EMDKManager;

      import com.symbol.emdk.EMDKManager.EMDKListener;

      import com.symbol.emdk.EMDKResults;

      import com.symbol.emdk.EMDKResults.STATUS_CODE;

      import com.symbol.emdk.ProfileManager;

       

      import java.util.ArrayList;

       

      public class MainActivity extends Activity implements EMDKListener {

       

         //Assign the profile name used in EMDKConfig.xml
         private String profileName = "DataCaptureProfile";

       

         //Assign the profile name used in EMDKConfig.xml for MSR handling
         private String profileNameMSR = "DataCaptureProfileMSR";

       

         //Assign the profile name used in EMDKConfig.xml for Broadcast Intent handling
         private String profileNameBroadcastIntent = "DataCaptureProfileBroadcastIntent";

       

         //Declare a variable to store ProfileManager object
         private ProfileManager mProfileManager = null;

       

         //Declare a variable to store EMDKManager object
         private EMDKManager emdkManager = null;

       

         //Declare a variable to store the textViewBarcode
         private TextView textViewBarcode = null;

       

         //Declare a variable to store the buttonMSR
         private Button buttonMSR = null;

       

         //Declare a variable to store the buttonBroadcastIntent
         private Button buttonBroadcastIntent = null;

       

         //App context
         static Context appContext;

       

         @Override
         protected void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

         appContext = getApplicationContext();

       

         //The EMDKManager object will be created and returned in the callback.
         EMDKResults results = EMDKManager.getEMDKManager(getApplicationContext(), this);

       

         //Check the return status of getEMDKManager
         if(results.statusCode == STATUS_CODE.FAILURE)

        {

         //Failed to create EMDKManager object
         }

       

       

         //In case we have been launched by the DataWedge intent plug-in
         Intent i = getIntent();

        handleDecodeData(i);

        }

       

       

         //OnClickListener for buttonBroadcastIntent
         private OnClickListener buttonBroadcastIntentOnClick = new OnClickListener() {

         public void onClick(View v) {

         //Launch OrderDetailActivity
         Intent myIntent = new Intent(MainActivity.this, BroadcastIntentActivity.class);

        startActivity(myIntent);

        }

        };

       

         //We need to handle any incoming intents, so let override the onNewIntent method
         @Override
         public void onNewIntent(Intent i) {

        handleDecodeData(i);

        }

       

         @Override
         protected void onDestroy() {

         // TODO Auto-generated method stub
         super.onDestroy();

       

         //Clean up the objects created by EMDK manager
         emdkManager.release();

        }

       

         @Override
         public void onClosed() {

         // TODO Auto-generated method stub

         }

       

         @Override
         public void onOpened(EMDKManager emdkManager) {

         // TODO Auto-generated method stub
         //EMDK opened.

         this.emdkManager = emdkManager;

       

         //Get the ProfileManager object to process the profiles
         mProfileManager = (ProfileManager) emdkManager.getInstance(EMDKManager.FEATURE_TYPE.PROFILE);

       

         if(mProfileManager != null)

        {

        String[] modifyData = new String[1];

       

         //Call processPrfoile with profile name and SET flag to create the profile. The modifyData can be null.
         EMDKResults results = mProfileManager.processProfile(profileName, ProfileManager.PROFILE_FLAG.SET, modifyData);

       

         if(results.statusCode == STATUS_CODE.FAILURE)

        {

         //Failed to set profile
         }

       

         //Call processPrfoile for profile MSR
         results = mProfileManager.processProfile(profileNameMSR, ProfileManager.PROFILE_FLAG.SET, modifyData);

       

         if(results.statusCode == STATUS_CODE.FAILURE)

        {

         //Failed to set profile MSR
         }

       

         //Call processPrfoile for profile Broadcast Intent.
         results = mProfileManager.processProfile(profileNameBroadcastIntent, ProfileManager.PROFILE_FLAG.SET, modifyData);

       

         if(results.statusCode == STATUS_CODE.FAILURE)

        {

         //Failed to set profile
         }

        }

       

        }

       

         //This function is responsible for getting the data from the intent
         private void handleDecodeData(Intent i)

        {

         //Check the intent action is for us
         if (i.getAction().contentEquals("com.symbol.emdksample.RECVR") ) {

         //Get the source of the data
         String source = i.getStringExtra("com.motorolasolutions.emdk.datawedge.source");

       

         //Check if the data has come from the barcode scanner
         if(source.equalsIgnoreCase("scanner"))

        {

         //Get the data from the intent
         String data = i.getStringExtra("com.motorolasolutions.emdk.datawedge.data_string");

       

         //Check that we have received data
         if(data != null && data.length() > 0)

        {

       

         //Send the order number to async to be parsed
         AsyncTask<String, Void, ArrayList> task = new DownloadDataJson(this).execute(data, null, null);

        Log.d("Main order ", "Barcocde scanned :" + data.toString());

        }

        }

        }

        }

      }