通知空指针异常

Notification Null Pointer Exception

我正在开发音频播放器。当我播放音乐时,我可以在音频播放器上播放任何音乐,而不是它为音乐创建通知。

音频播放器可以完美播放音乐,但我的问题是,当我按下通知图标时,它显示跳转播放器出现空指针异常Activity,我知道 uri 是空的,因为破坏了 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() 是用于从 intent

获取数据的函数
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);
}

这是我的 logcat

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) 

我知道 Source 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);
}

您正在通过 intent 发送对象并试图在接收时捕获 String

您可以在 class Audio 中实现 Serializable interface ,然后使用 putExtra(Serializable)[=17= 在 intent extra 中传递对象实例]

示例:

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