BroadcastReceiver的设备开机之后,无法启动 [英] BroadcastReceiver is not started after device boot
问题描述
设备重新启动后,我想运行我的接收机,使得该设备可以播放音频时,设备屏幕开启或关闭不通过应用程序进行手动设置。
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屋!