0

I'm trying to run a function that requires passing it a screen capture. When I run this from the main activity, I can run the code like this:

SendScreenFunction(getWindow().getDecorView().getRootView(), getApplicationContext());

I'm not trying to call this function from a service and I can't access the getWindow() function because it requires an activity (which isn't available in the service). I was looking around online and someone suggested a function to get the activity so I can use the function. My current code looks like this:

public class ASTasks extends Service {

    // This method run only one time. At the first time of service created and running
    @Override
    public void onCreate() {
        HandlerThread thread = new HandlerThread("ServiceStartArguments",
                Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();
        Log.d("onCreate()", "After service created");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Toast.makeText(this, "Entered Timer!", Toast.LENGTH_SHORT).show();

        Activity main_activity = getActivity(getApplicationContext());
        try {
            Log.i("Services", "Before crash");
            SendScreenFunction(main_activity.getWindow().getDecorView().getRootView(), getApplicationContext());
            Log.i("Services", "After crash");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding
        return null;
    }

    public void SendScreenFunction(View view, Context context){
    // Function goes here
    }

    public static Activity getActivity(Context context) {
        if (context == null) return null;
        if (context instanceof Activity) return (Activity) context;
        if (context instanceof ContextWrapper) return getActivity(((ContextWrapper)context).getBaseContext());
        return null;
    }

}


Unfortunately, that solution doesn't seem to work and it's crashing. The Logcat error is shown below:

Process: com.example.ASservice:remote, PID: 15966
                                                                                                    java.lang.RuntimeException: Unable to start service com.example.ASservice.ASTasks@6e7fed5 with Intent { cmp=com.example.ASservice/.ASTasks }: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Activity.getWindow()' on a null object reference
                                                                                                        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:5110)
                                                                                                        at android.app.ActivityThread.access$2100(ActivityThread.java:310)
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:226)
                                                                                                        at android.os.Looper.loop(Looper.java:313)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8680)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
                                                                                                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Activity.getWindow()' on a null object reference
                                                                                                        at com.example.ASservice.ASTasks.onStartCommand(ASTasks.java:41)
                                                                                                        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:5092)
                                                                                                        at android.app.ActivityThread.access$2100(ActivityThread.java:310) 
                                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2319) 
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                                        at android.os.Looper.loopOnce(Looper.java:226) 
                                                                                                        at android.os.Looper.loop(Looper.java:313) 
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8680) 
                                                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567) 
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 

Any ideas on the best way to take the screen capture from within the service (or even a way to pass a flag back to main to process it there)?

Any suggestions would be greatly appreciated. Thanks!

Bob Dole
  • 31
  • 3

0 Answers0