1

I want develop android application and i write below codes, but when running application and when close application from taskBar (clear apps) show me this error :

E/AndroidRuntime: FATAL EXCEPTION: main
Process: in.nouri.cameraalways, PID: 5300
java.lang.RuntimeException: Unable to start service in.nouri.cameraalways.Service.OverlayService@ba23650 with null: java.lang.NullPointerException: Attempt to invoke virtual method 'float android.content.Intent.getFloatExtra(java.lang.String, float)' on a null object reference
 at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3394)
 at android.app.ActivityThread.-wrap21(ActivityThread.java)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:154)
 at android.app.ActivityThread.main(ActivityThread.java:6247)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'float android.content.Intent.getFloatExtra(java.lang.String, float)' on a null object reference
 at in.nouri.cameraalways.Service.OverlayService.onStartCommand(OverlayService.java:113)
 at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3377)
 at android.app.ActivityThread.-wrap21(ActivityThread.java) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:154) 
 at android.app.ActivityThread.main(ActivityThread.java:6247) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 

My Service class :

public class OverlayService extends Service {
    public static final String ACTION_CHANGE_ALPHA = "in.nouri.cameraalways.action.CHANGE_ALPHA";

    public static final String EXTRA_ALPHA = "in.nouri.cameraalways.extra.ALPHA";
    public static final String EXTRA_SX = "in.nouri.cameraalways.extra.ScaleX";
    public static final String EXTRA_SY = "in.nouri.cameraalways.extra.ScaleY";

    private View mOverlayView;

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("OverlayService", "(broadcast received) action:" + intent.getAction());
            switch (intent.getAction()) {
                case ACTION_CHANGE_ALPHA:
                    setOverlayAlpha(intent.getFloatExtra(EXTRA_ALPHA, CamOverlay.DEFAULT_ALPHA));
                    break;
            }
        }
    };

    private static boolean running = false;

    public static void start(Context context) {
        SharedPreferences sharedPreferences =
                PreferenceManager.getDefaultSharedPreferences(context);
        float alpha = Float.parseFloat(sharedPreferences.getString(
                context.getString(R.string.key_pref_alpha), String.valueOf(CamOverlay.DEFAULT_ALPHA)));
        float sx = sharedPreferences.getBoolean(
                context.getString(R.string.key_pref_invert_x), false) ? -1 : 1;
        float sy = sharedPreferences.getBoolean(
                context.getString(R.string.key_pref_invert_y), false) ? -1 : 1;
        Bundle bundle = new Bundle();
        bundle.putFloat(EXTRA_ALPHA, alpha);
        bundle.putFloat(EXTRA_SX, sx);
        bundle.putFloat(EXTRA_SY, sy);
        start(context, bundle);
    }

    public static void start(Context context, @NonNull Bundle bundle) {
        Intent intent = new Intent(context, OverlayService.class);
        intent.putExtras(bundle);
        context.startService(intent);
    }

    public static void stop(Context context) {
        Intent intent = new Intent(context, OverlayService.class);
        context.stopService(intent);
    }

    public static void toggle(Context context) {
        if (running)
            stop(context);
        else
            start(context);
    }

    public static boolean isRunning() {
        String str;
        if (running) {
            str = "RUNNING";
        } else {
            str = "NOT running";
        }
        Log.d("OverlayService", "service is " + str);
        return running;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Log.d("OverlayService", "onCreate");
        super.onCreate();
        running = true;

        mOverlayView = CamOverlay.show(this);

        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_CHANGE_ALPHA);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("OverlayService", "onStartCommand");
            setOverlayAlpha(intent.getFloatExtra(EXTRA_ALPHA, CamOverlay.DEFAULT_ALPHA));
            float sx = intent.getFloatExtra(EXTRA_SX, 1);
            float sy = intent.getFloatExtra(EXTRA_SY, 1);
            setOverlayScale(sx, sy);

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d("OverlayService", "onDestroy");
        super.onDestroy();
        running = false;
        unregisterReceiver(mReceiver);

        CamOverlay.hide();
    }

    protected void setOverlayAlpha(float alpha) {
        if (mOverlayView != null) {
            mOverlayView.setAlpha(alpha);
        }
    }

    void setOverlayScale(float sx, float sy) {
        if (mOverlayView != null) {
            mOverlayView.setScaleX(sx);
            mOverlayView.setScaleY(sy);
        }
    }
}

My dear friends, i know this error for nullPointerException but i don't know how can i fix this?

please don't give me negative points. Thanks all <3

Pavneet_Singh
  • 36,884
  • 5
  • 53
  • 68

1 Answers1

3

The issue is when you kill your app then Android os will try to recreate your service and at that time you will have intent as null and you are again trying to fetch data from intent inside onStartCommand which at this point will be null so to get the intent again at the time of recreation use START_REDELIVER_INTENT

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("OverlayService", "onStartCommand");
            setOverlayAlpha(intent.getFloatExtra(EXTRA_ALPHA, CamOverlay.DEFAULT_ALPHA));
            float sx = intent.getFloatExtra(EXTRA_SX, 1);
            float sy = intent.getFloatExtra(EXTRA_SY, 1);
            setOverlayScale(sx, sy);

        return START_REDELIVER_INTENT;
    }

or if you don't want the OS to recreate your service then use START_NOT_STICKY

Pavneet_Singh
  • 36,884
  • 5
  • 53
  • 68