Разрабатываю аудиоплеер. Я могу воспроизводить любую музыку на аудиоплеере, когда я проигрываю музыку, чем он создает уведомление для музыки.

Аудиоплеер работает префектом для воспроизведения музыки, но моя проблема в том, что когда я нажимаю на значок уведомления, он показывает мне исключение нулевого указателя для прыжка playerActivity, я знаю, что uri имеет значение null из-за разрушения Activity, но я не могу понять, как справиться с этой проблемой.

Вот мой код

adapter.setOnItemClickListner(new AudioDeatailAdapter.OnItemClckListner() { 
    @Override
    public void OnClick(ArrayList<Audio> audioArrayList,int possition) {
        String media = audioArrayList.get(possition).getData();

        Intent intent = new Intent(AudioActivity.this,PlayerAudioActivity.class);
        intent.putExtra("uri",media);
        startActivity(intent);
    }
}

При нажатии на элемент он получает uri и отправляется в намерение в PlayerAudio Activity PlayerAudio Activity getdata() - это функция, которая используется для получения данных из намерения

public void getData() {

    Intent intent = getIntent();
    try {
        sourceUri = Uri.parse(intent.getStringExtra("uri"));
    } 
    catch (Exception e) {
      e.printStackTrace();
      sourceUri = intent.getData();
    }

    File file = new File(sourceUri.toString());
    if (file != null && file.length() != 0) {
        String filename = file.getName();
        txt_name.setText(filename);
        txt_name.setSelected(true); 
    }
}

И внутри функции start () запускается служба и воспроизводится музыка, а также отображается уведомление, когда я нажимаю уведомление, оно показывает исключение нулевого указателя для этой функции

File file = new File(sourceUri.toString();

if (file != null && file.length() != 0) {
    String filename = file.getName();
    txt_name.setText(filename);
}

Вот мой код уведомления

@Override
public void onPrepared(MediaPlayer mp) {
    //start playback
    prerationListner.prepared();
    this.handler.postDelayed(seekBarRunable, 100);

    mp.start();
    //notification
    Intent notIntent = new Intent(this, PlayerAudioActivity.class);
    notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendInt = PendingIntent.getActivity(this, 0,
            notIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification.Builder builder = new Notification.Builder(this);

    builder.setContentIntent(pendInt)
            .setSmallIcon(R.drawable.ic_play)
            .setTicker(songTitle)
            .setOngoing(true)
            .setAutoCancel(true)
            .setContentTitle("Playing")
            .setContentText(songTitle);
    Notification not = builder.build();
    startForeground(NOTIFY_ID, not);
}

Вот мой логарифм

java.lang.RuntimeException: Unable to start activity ComponentInfo{studio.freeapp.com.jplayer/studio.freeapp.com.jplayer.activity.PlayerAudioActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
    at android.app.ActivityThread.-wrap14(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6682)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1534)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1424)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference
    at studio.freeapp.com.jplayer.activity.PlayerAudioActivity.getData(PlayerAudioActivity.java:319)
    at studio.freeapp.com.jplayer.activity.PlayerAudioActivity.onCreate(PlayerAudioActivity.java:113)
    at android.app.Activity.performCreate(Activity.java:6942)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988) 
    at android.app.ActivityThread.-wrap14(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6682) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1534)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1424) 

Я знаю, что исходный uri имеет значение null, как решить эту проблему?

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

@Override
public void onPrepared(MediaPlayer mp) {
    //start playback
    prerationListner.prepared();
    this.handler.postDelayed(seekBarRunable, 100);

    mp.start();
    //notification
    Intent notIntent = new Intent(this, PlayerAudioActivity.class);
    notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    notIntent.putExtra("uri", sourceUri);
    notIntent.putExtra("playerpos", true);
    PendingIntent pendInt = PendingIntent.getActivity(this, 0, notIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification.Builder builder = new Notification.Builder(this);

    builder.setContentIntent(pendInt)
            .setSmallIcon(R.drawable.ic_play)
            .setTicker(songTitle)
            .setOngoing(true)
            .setAutoCancel(true)
            .setContentTitle("Playing")
            .setContentText(songTitle);
    Notification not = builder.build();
    startForeground(NOTIFY_ID, not);
}
0
Ayaz Muhammad 3 Янв 2018 в 09:04

1 ответ

Лучший ответ

Вы отправляете объект через intent и пытаетесь захватить String при получении.

Вы можете реализовать Serializable interface в class Audio, а затем передать экземпляры объекта в намерении extra с помощью putExtra (Serializable)

Примере:

Audio media = audioArrayList.get(possition);
Intent intent = new Intent(AudioActivity.this,PlayerAudioActivity.class);
intent.putExtra("uri",media);

//On reception

sourceUri = Uri.parse(intent.getSerializableExtra("uri"));
0
Suhayl SH 3 Янв 2018 в 06:22