1

After device reboot, I want to run my receiver so that the device can play audio when the device screen is turned on or turned off without setting them manually through the app.

MusicList.java

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.music_layout);
startService(new Intent(getApplicationContext(), LockScreenService.class));

//other codes

});

//send chosen music
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        if(lockIsChosen!=null) {
            //other codes
            try {
                Intent i = new Intent("my.action");
                i.putExtra("posLock", newPosition2).putExtra("songlistLock", mySongs).putExtra("lockSound", "lock");
                sendBroadcast(i);
            }catch (Exception e) {
                Log.e(TAG, "Intent error");
            }
            finish();

        }
        if(unlockIsChosen!=null) {

            //other codes
            try {
                Intent i = new Intent("my.action.unlock");
                i.putExtra("posUnlock", newPosition3).putExtra("songlistUnlock", mySongs).putExtra("unlockSound", "unlock");
                sendBroadcast(i);
            }catch (Exception e) {
                Log.e(TAG, "Intent error2");
            }

            finish();
        }
    }
});

This is what I wrote in my receiver

 public class LockScreenReceiver extends BroadcastReceiver {

 MediaPlayer mp;
 ArrayList<File> mySongs;
 ArrayList<File> mySongs2;
 Uri u;
 Uri u2;
 AudioManager am;

     @Override
     public void onReceive(Context context, Intent intent) {

         String action = intent.getAction();
         am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

         if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
             Intent service = new Intent(context, LockScreenService.class);
             context.startService(service);
          //I tried this just for testing, but no toast is shown after device reboot
             Toast.makeText(context, u2.toString(), Toast.LENGTH_SHORT).show();

         }

         if(action.equals("my.action")) {
             Bundle b = intent.getExtras();
             mySongs = (ArrayList) b.getParcelableArrayList("songlistLock");
             int position = b.getInt("posLock", 0);

             u = Uri.parse(mySongs.get(position).toString());
         }

         if(action.equals("my.action.unlock")) {
             Bundle b = intent.getExtras();
             mySongs2 = (ArrayList) b.getParcelableArrayList("songlistUnlock");
             int position = b.getInt("posUnlock", 0);

             u2 = Uri.parse(mySongs2.get(position).toString());
         }

         if (action.equals(Intent.ACTION_SCREEN_ON) && am.getRingerMode() == AudioManager.RINGER_MODE_NORMAL)
         {
             if(u2!=null) {
                 stopPlaying();
                 mp = MediaPlayer.create(context, u2);
                 mp.start();
                 Toast.makeText(context, u2.toString(), Toast.LENGTH_SHORT).show();
             }
         }
         else if (action.equals(Intent.ACTION_SCREEN_OFF) && am.getRingerMode() == AudioManager.RINGER_MODE_NORMAL)
         {
             if(u!=null) {
                 stopPlaying();
                 mp = MediaPlayer.create(context, u);
                 mp.start();
                 Toast.makeText(context, u.toString(), Toast.LENGTH_SHORT).show();

             }
         }

     }

private void stopPlaying() {
    if (mp != null) {
        mp.stop();
        mp.release();
        mp = null;
    }
}
}

And here's the Service class

public class LockScreenService extends Service {

BroadcastReceiver receiver;

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

@Override
@SuppressWarnings("deprecation")
public void onCreate() {

    //Start listening for the Screen On, Screen Off, and Boot completed actions
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_BOOT_COMPLETED);
    //Set up a receiver to listen for the Intents in this Service
    receiver = new LockScreenReceiver();
    registerReceiver(receiver, filter);
    registerReceiver( receiver, new IntentFilter( "my.action" ) );
    registerReceiver( receiver, new IntentFilter( "my.action.unlock" ) );

   //Toast is not shown after device reboot
   Toast.makeText(getApplicationContext(), "Starting service now", Toast.LENGTH_SHORT).show();

    super.onCreate();
}

@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

}

My manifest, which I believe there's nothing wrong with it

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_SERVICE"/>

    <service android:name=".LockScreenService" />

    <receiver
        android:name=".LockScreenReceiver">
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="my.action" />
            <action android:name="my.action.unlock" />
        </intent-filter>
    </receiver>

What is it that I am doing wrong? Some says that I should do my stuff on service instead, but doing that will crash the app on boot. I've been stuck here for days. Please help.

Also, might be a relevant question: Do I need sharedpreferences for my app so that it is able to do what I want? The files fetched from device storage.

Here is the link to my source file, so that people can pinpoint what I do wrong https://github.com/PiersonLeo94/SOUN-WAKE

Please take a look at the v1.1 version

  • 1). Change position of `android.permission.RECEIVE_BOOT_COMPLETED`, put it after ` – Yuriy Kolbasinskiy Nov 27 '15 at 09:18
  • This link helps you http://stackoverflow.com/questions/2784441/trying-to-start-a-service-on-boot-on-android – saeed Nov 27 '15 at 09:24
  • Please check whether 'onReceive' is called?.. Put a log here '@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction();' – DGN Nov 27 '15 at 10:52
  • @DGN I have put a log in if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {} but it doesn't show it in my logcat. – Pierson Leo Nov 27 '15 at 14:57
  • @YuriyKolbasinskiy Yeah, I'm sure my receiver doesn't start. The log doesn't appear after device reboot. – Pierson Leo Nov 28 '15 at 03:38

1 Answers1

1

Define your manifest something like this.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dev.hb.testing">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver android:name=".LockScreenReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".WelcomeActivity" />
    </application>

</manifest>
Nigam Patro
  • 2,760
  • 1
  • 18
  • 33