title: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE TYPE_MEDIA_PROJECTION in Android Pie and Q
body: <p>any body knows why this error occur, Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION on   getMediaProjection() even i call  getMediaProjection() method after calling startforeground() method..!</p>
  
  <p>Stack Trace is :</p>
  
  <pre><code>  Process: com.al1.screenrecorder, PID: 24641
  java.lang.RuntimeException: Unable to start service com.al1.screenrecorder.service.DisplayRecorderService@9ef2101 with Intent { cmp=com.al1.screenrecorder/.service.DisplayRecorderService (has extras) }: java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4661)
      at android.app.ActivityThread.access$2900(ActivityThread.java:292)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2246)
      at android.os.Handler.dispatchMessage(Handler.java:107)
      at android.os.Looper.loop(Looper.java:213)
      at android.app.ActivityThread.main(ActivityThread.java:8147)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
   Caused by: java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
      at android.os.Parcel.createException(Parcel.java:2071)
      at android.os.Parcel.readException(Parcel.java:2039)
      at android.os.Parcel.readException(Parcel.java:1987)
      at android.media.projection.IMediaProjection$Stub$Proxy.start(IMediaProjection.java:231)
      at android.media.projection.MediaProjection.&lt;init&gt;(MediaProjection.java:75)
      at android.media.projection.MediaProjectionManager.getMediaProjection(MediaProjectionManager.java:104)
      at com.al1.screenrecorder.service.DisplayRecorderService.createMediaProjection(DisplayRecorderService.java:118)
      at com.al1.screenrecorder.service.DisplayRecorderService.onStartCommand(DisplayRecorderService.java:107)
      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4641)
      at android.app.ActivityThread.access$2900(ActivityThread.java:292) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2246) 
      at android.os.Handler.dispatchMessage(Handler.java:107) 
      at android.os.Looper.loop(Looper.java:213) 
      at android.app.ActivityThread.main(ActivityThread.java:8147) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 
   Caused by: android.os.RemoteException: Remote stack trace:
      at com.android.server.media.projection.MediaProjectionManagerService$MediaProjection.start(MediaProjectionManagerService.java:498)
      at android.media.projection.IMediaProjection$Stub.onTransact(IMediaProjection.java:135)
      at android.os.Binder.execTransactInternal(Binder.java:1028)
      at android.os.Binder.execTransact(Binder.java:1001)
  </code></pre>
  
  <p><strong>strong text</strong>
         private void startForeground() {</p>
  
  <pre><code>    Intent activityIntent = new Intent(this, MainActivity.class);
      activityIntent.setAction("stop");
      PendingIntent contentIntent = PendingIntent.getActivity(this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  
      if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.O) {
  
          String channelId = "001";
          String channelName = "myChannel";
          NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_NONE);
          channel.setLightColor(Color.BLUE);
          channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
  
          NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  
          if (manager != null) {
              manager.createNotificationChannel(channel);
              Notification notification = new Notification.
                      Builder(getApplicationContext(), channelId)
                      .setOngoing(true)
                      .setSmallIcon(R.mipmap.ic_launcher)
                      .setCategory(Notification.CATEGORY_SERVICE)
                      .setContentTitle(getString(R.string.ClickToCancel))
                      .setContentIntent(contentIntent)
                      .build();
              if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.Q) {
                  startForeground(0, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION);
              } else {
                  startForeground(0, notification);
              }
          }
      } else {
          startForeground(0, new Notification());
      }
  
  }
  </code></pre>
  
  <p>and onStartCommand is :</p>
  
  <pre><code>public int onStartCommand(Intent intent, int flags, int startId) {
      Log.i(TAG, "Service onStartCommand() is called");
  
      startForeground();
  
      mResultCode = intent.getIntExtra("code", -1);
      mResultData = intent.getParcelableExtra("data");
      mScreenWidth = intent.getIntExtra("width", 720);
      mScreenHeight = intent.getIntExtra("height", 1280);
      mScreenDensity = intent.getIntExtra("density", 1);
      isVideoSd = intent.getBooleanExtra("quality", true);
      isAudio = intent.getBooleanExtra("audio", true);
  
  
      mMediaProjection = createMediaProjection();
      mMediaRecorder = createMediaRecorder();
      mVirtualDisplay = createVirtualDisplay();
      mMediaRecorder.start();
  
      return Service.START_STICKY;
  }
  </code></pre>
  
  <p>and exception is in this method on getMediaProjection:</p>
  
  <pre><code> private MediaProjection createMediaProjection() {
      Log.i(TAG, "Create MediaProjection");
      return ((MediaProjectionManager) Objects.requireNonNull(getSystemService(Context.MEDIA_PROJECTION_SERVICE))).
              getMediaProjection(mResultCode, mResultData);
  }
  </code></pre>