Я добавил фоновую музыку в свое приложение. У меня есть три действия, поэтому я хочу создать класс музыкального контроллера, который будет управляться этими тремя действиями. Но когда я создаю объект serviceIntent в MainActivtiy и передаю его классу MusicController, serviceIntent не может быть запущен, и возникает ошибка исключения с нулевым указателем. Кто-нибудь, как разобраться в этой проблеме? Заранее спасибо.

< Сильный > Logcat :

04-13 22:30:15.189: D/AndroidRuntime(9581): Shutting down VM 04-13 22:30:15.190: E/AndroidRuntime(9581): FATAL EXCEPTION: main 04-13 22:30:15.190: E/AndroidRuntime(9581): Process: com.example.funwithmath, PID: 9581 04-13 22:30:15.190: E/AndroidRuntime(9581): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.funwithmath/com.example.funwithmath.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ComponentName android.content.Context.startService(android.content.Intent)' on a null object reference 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.ActivityThread.access$800(ActivityThread.java:151) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.os.Handler.dispatchMessage(Handler.java:102) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.os.Looper.loop(Looper.java:135) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.ActivityThread.main(ActivityThread.java:5254) 04-13 22:30:15.190: E/AndroidRuntime(9581): at java.lang.reflect.Method.invoke(Native Method) 04-13 22:30:15.190: E/AndroidRuntime(9581): at java.lang.reflect.Method.invoke(Method.java:372) 04-13 22:30:15.190: E/AndroidRuntime(9581): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 04-13 22:30:15.190: E/AndroidRuntime(9581): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 04-13 22:30:15.190: E/AndroidRuntime(9581): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ComponentName android.content.Context.startService(android.content.Intent)' on a null object reference 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.content.ContextWrapper.startService(ContextWrapper.java:516) 04-13 22:30:15.190: E/AndroidRuntime(9581): at com.example.funwithmath.util.MusicController.startMusic(MusicController.java:25) 04-13 22:30:15.190: E/AndroidRuntime(9581): at com.example.funwithmath.MainActivity.onCreate(MainActivity.java:58) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.Activity.performCreate(Activity.java:5990) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 04-13 22:30:15.190: E/AndroidRuntime(9581): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 04-13 22:30:15.190: E/AndroidRuntime(9581): ... 10 more

MainActivity.java

public class MainActivity extends Activity {

private Button sound;
private Intent serviceIntent;
private MusicController musiControl;
private boolean musicPlayStatus = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sound = (Button) findViewById(R.id.sound);
    sound.setBackgroundResource(R.drawable.soundopen);
    serviceIntent = new Intent(this, MusicServer.class);


    //Control Background Music
    musiControl = new MusicController (serviceIntent);
    musiControl.startMusic();

MusicController.java

public class MusicController extends Activity {

private boolean musicPlayStatus = true;
private Intent serviceIntent;

public MusicController(Intent serviceIntent) {
    // TODO Auto-generated constructor stub

    this.serviceIntent = serviceIntent;

}

public void startMusic() {
    // TODO Auto-generated method stub
    // Start Music

    startService(serviceIntent);
    musicPlayStatus = true;

}
0
Di Wang 14 Апр 2016 в 05:44

2 ответа

Лучший ответ

Эта строка сообщает вам, что вам нужно знать

Попытка вызвать виртуальный метод android.content.ComponentName android.content.Context.startService (android.content.Intent) для ссылки на нулевой объект

Обычно в вашем классе MusicController нет контекста. Классу нужно знать, где запустить службу. Мы можем исправить это, передав контекст mainActivity.

public class MusicController extends Activity {

private boolean musicPlayStatus = true;
private Intent serviceIntent;
private Context context;

public MusicController(Context c, Intent serviceIntent) {
    // TODO Auto-generated constructor stub
    context = c;
    this.serviceIntent = serviceIntent;

}

public void startMusic() {

    context.startService(serviceIntent);
    musicPlayStatus = true;

}
0
Max Pavlov 14 Апр 2016 в 16:25

Вы не назначаете объект с помощью нового

MusicController.java

public class MusicController extends Activity {

private boolean musicPlayStatus = true;
private Intent serviceIntent;

public MusicController(Intent serviceIntent) {
    // TODO Auto-generated constructor stub

    this.serviceIntent = serviceIntent;

}

public void startMusic() {
    // TODO Auto-generated method stub
    // Start Music
serviceIntent= new Intent(MusicController.this, YourService.class);
    startService(serviceIntent);
    musicPlayStatus = true;

}

Здесь я могу показать вам простой способ запуска и остановки служб

Для запуска службы

startService(new Intent(this, MainService.class));

Для остановки службы

stopService(new Intent(this, MainService.class));

Примечание. Не забудьте добавить службу в свой AndroidManifest.

<service android:enabled="true" android:name=".MainService" />
1
Arpit Patel 14 Апр 2016 в 04:22