BroadcastReceiver的设备开机之后,无法启动 [英] BroadcastReceiver is not started after device boot

查看:310
本文介绍了BroadcastReceiver的设备开机之后,无法启动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

设备重新启动后,我想运行我的接收机,使得该设备可以播放音频时,设备屏幕开启或关闭不通过应用程序进行手动设置。

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

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();
        }
    }
});

这是我在我的接收器写

 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;
    }
}
}

和这里的服务类

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.

另外,可能是一个相关的问题:我是否需要共享preferences我的应用程序,以便它能够做什么,我想要什么?该文件从存储设备读取。

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.

下面是链接到我的源文件,使人们可以找出我做什么错 https://github.com/PiersonLeo94/SOUN-WAKE

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

请看看在V1.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>

这篇关于BroadcastReceiver的设备开机之后,无法启动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆