2015-11-27 2 views
0

Вот как я написал свое приложение.Приложение сразу же сбой при загрузке телефона

MusicList

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

И в моем классе обслуживания, это то, что я написал

LockScreenService

public class LockScreenService extends Service { 

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

public class LockScreenReceiver extends BroadcastReceiver { 

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

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

     } 
    } 

} 

} 

@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")); 

    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
} 

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

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

А вот мой Manifest

AndroidManifest

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

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

    <receiver 
     android:name=".LockScreenService$LockScreenReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

Что я хочу сделать, когда пользователь загрузил свой телефон, я хочу, чтобы ресивер мог проигрывать медиаплеер. Чтобы звук воспроизводился всякий раз, когда пользователь включал или выключал экран своего телефона, без необходимости вручную устанавливать его вручную через приложение.

Я не знаю, что вызывает мое приложение. Есть что-то, что мне не хватает?

+0

Отправьте свою ошибку logcat –

+0

Возьмите BroadcastReceiver в отдельном классе. Это сбой, потому что, когда андроид пытается запустить широковещательную передачу, поскольку служба еще не запущена, она не может найти ее, поэтому она рушится. –

ответ

1

Создать автономный BroadcastReceiver. На данный момент ваша служба не запускается. Таким образом, вы получаете доступ к приемнику Broadcast через службу, которая на самом деле не существует. Я думаю, таким образом, создание отдельного класса для BroadcastReceiver сделает трюк.

+0

Я следил за вашим предложением, и приложение больше не разбивается. Но ничего не происходит? –

+0

ОК. Не могли бы вы изменить свой вопрос с помощью нового кода, чтобы мы могли проверить? – DGN

+0

Я сделал новый вопрос: https://stackoverflow.com/questions/33953483/broadcastreceiver-is-not-started-after-device-boot?noredirect1_comment55666038_33953483 –

-1

Вы получили имя получателя трансляций и имя приемника манифестора андроид.

LockScreenReceiver или в манифесте LockScreenService$LockScreenReceiver.

Вы должны управлять им с помощью different class вещанияReciver.

Смежные вопросы