2021年3月19日星期五

Start Service in BroadCastReceiver android 8

I want to Start a long time Service which observes the android Downloads folder , I have created a BroadcastReceiver which receives the BOOT_COMPLETED event and this BroadcastReceiver will start the Service using context.startStartService() method. It seems the way it is working correct in android versions below 8 but for higher versions of android I get an error which is

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{ba36f7 u0 packagename/.FileSystemObserverService}  

StartupBroadCastReceiver

  public class StartupReceiver extends BroadcastReceiver {      private static final String TAG = "StartupReceiver";      @Override      public void onReceive(Context context, Intent intent) {          Log.e(TAG, "onReceive: called " );          appendLog(context,"OnReceived called StartupReceive line 20");          Toast.makeText(context, "Boot Completed", Toast.LENGTH_SHORT).show();          Intent myIntent = new Intent(context, FileSystemObserverService.class);          if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){               context.startForegroundService(myIntent);              return;          }            context.startService(myIntent);      }        private void appendLog(Context context,String log){          SharedPreferences sp  = context.getSharedPreferences("sp",Context.MODE_PRIVATE);          String preLogs = sp.getString("logs","");          preLogs+="\n"+log;          sp.edit().putString("logs",preLogs).apply();      }      }  

Above code is my BroadcastReceiver which receives BOOT_COMPLETED event.

FileSystemObserver

public class FileSystemObserverService extends Service {        private Observer mMainObserver;      private static final String TAG = "FileSystemObserverServi";      @Override      public int onStartCommand(Intent intent, int flags, int startId) {          Log.e(TAG, "onStartCommand: get called " );          observe();          return super.onStartCommand(intent, flags, startId);      }        @Override      public void onDestroy() {          super.onDestroy();          Log.e(TAG, "onDestroy: called for fileObserverService");      }          @Nullable      @Override      public IBinder onBind(Intent intent) {          return null;      }        public void observe(){          Thread t= new Thread(new Runnable() {              @Override              public void run() {                  Log.e(TAG, "run: thread is running " );                  File str = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);                  if (str!=null){                      Log.e(TAG, "run: "+str.getAbsolutePath());                      String downloadsPath = str.getAbsolutePath();                     mMainObserver= new Observer(downloadsPath, new DataInterface() {                         @Override                         public String getMacAddress() {                             SharedPreferences sp = getSharedPreferences("sp",MODE_PRIVATE);                             return sp.getString("mac_address",null);                         }                           @Override                         public void appendLog(String log) {                             SharedPreferences sp  = getSharedPreferences("sp",MODE_PRIVATE);                             String preLogs = sp.getString("logs","");                             preLogs+="\n"+log;                             sp.edit().putString("logs",preLogs).apply();                         }                     });                     mMainObserver.startWatching();                  }              }          });          t.setPriority(Thread.MIN_PRIORITY);          t.start();      }  }    interface DataInterface{      public String getMacAddress();      public void appendLog(String log);  }    class Observer extends FileObserver{        private static final String TAG = "Observer";      List<SingleFileObserver> mObserves;      String mPath;      int mMask;      Context mContext;      private SendPDF sendPDF;      private DataInterface di ;          public Observer(String path,DataInterface di) {          this(path,ALL_EVENTS);          this.di = di;      }          @Override      public void startWatching() {          Log.e(TAG, "startWatching: getCalled" );          di.appendLog("Line 104 FileSystemObserverService startWatching : called");            try{                if(mObserves!=null)                  return;              mObserves = new ArrayList<SingleFileObserver>();              Stack<String> stack = new Stack<String>();              stack.push(mPath);              while (!stack.isEmpty()){                  String parent = stack.pop();                  mObserves.add(new SingleFileObserver(parent,mMask));                  File path  = new File(parent);                  File[] files = path.listFiles();                  if (files==null) continue;              }              for (SingleFileObserver ob  : mObserves){                  ob.startWatching();              }          }catch (Exception e){              di.appendLog("Line 124 FileSystemObserverService "+e.getMessage());          }            }        @Override      public void stopWatching() {          if (mObserves==null)              return;          for (SingleFileObserver ob : mObserves){              ob.stopWatching();          }          mObserves.clear();          mObserves = null;      }        public Observer(String path , int mask){          super(path,mask);          mPath = path;          mMask = mask;      }                public String getReadableEventName(int e ){          switch (e){              case FileObserver.OPEN:                  return  "OPEN";              case FileObserver.CREATE:                  return  "CREATE";              case DELETE_SELF:                  return  "DELETE_SELF";              case DELETE :                  return "DELETE";              case MOVED_FROM :                  return  "MOVED_FROM";              case MOVED_TO:                  return  "MOVED_TO";              case MOVE_SELF:                  return  "MOVED_SELF";              default:                  return "UNKNOWN";          }      }          @Override      public void onEvent(int event, @Nullable String path) {  //        if (mContext!=null)  //            Toast.makeText(mContext, "Event Called " +path, Toast.LENGTH_SHORT).show();          Log.e(TAG, "onEvent: Called "+path);          di.appendLog("Line 157 FileSystemObserverService   onEventCalled with " +event+" name:   " +getReadableEventName(event)+  " path: "+path);          try{                switch (event){                  case FileObserver.OPEN:                      Log.e(TAG, "onEvent: OPEN" );                      break;                  case FileObserver.CREATE:                      Log.e(TAG, "onEvent: CREATE");                        if (path!=null) {                          File file = new File(path);                          if (file.isDirectory())                              return;                          if (!path.endsWith(".pdf"))                              return;                          sendPDF = new SendPDF(path,di.getMacAddress(),di);                          di.appendLog("Line 200 FileSystemObserverService SendPdf instantiated  and trying to execute");                          sendPDF.execute();                      }                      break;                  case DELETE_SELF:                  case DELETE :                      Log.e(TAG, "onEvent: DELETE");                      break;                  case MOVED_FROM :                  case MOVED_TO:                  case MOVE_SELF:                      Log.e(TAG, "onEvent: MOVE");                      break;                  default:              }          }catch (Exception e){              di.appendLog( "Line 215 FileSystemObserverService "+e.getMessage());          }      }          private class SingleFileObserver extends FileObserver{          private String mPath ;            public SingleFileObserver(String path, int mask) {              super(path, mask);              mPath = path;          }              @Override          public void onEvent(int event, @Nullable String path) {              try{                  String newPath = mPath+"/"+path;                  Observer.this.onEvent(event,newPath);                  Log.e(TAG, "onEvent: "+newPath);              }catch (Exception e){                  Log.e(TAG, "onEvent: "+e.getMessage());              }          }      }  }        
https://stackoverflow.com/questions/66703027/start-service-in-broadcastreceiver-android-8 March 19, 2021 at 01:38PM

没有评论:

发表评论