android - 从 onResume 的最后位置恢复 MediaPlayer

标签 android nullpointerexception android-mediaplayer onresume onpause

我正在创建一个视频播放器。我已经实现了 onPause 方法来在按下主页按钮时获取媒体播放器的最后位置,并且在 onResume 中我将该位置设置为媒体播放器并调用开始。我的问题是,当我在 SDK 25 上运行应用程序时,它运行完美,但在 SDK < 24 上,应用程序崩溃,在媒体播放器上出现空指针异常

在 onCreate 方法中使用了以下方法:

mMediaPlayer.setOnVideoSizeChangedListener(this);


try {
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mMediaPlayer.setDataSource(this, Uri.parse(path));
    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.setOnCompletionListener(this);

} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (SecurityException e) {
    e.printStackTrace();
} catch (IllegalStateException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

MediaPlayerActivity 的 onPause:

@Override
    protected void onPause() {
        super.onPause();
        position = mMediaPlayer.getCurrentPosition();
        resumedActivity = true;
        mMediaPlayer.pause();
        if(servicerunning) {
            startnotification();
        }
    }

关于恢复:

 @Override
    protected void onResume() {
        super.onResume();

        if(resumedActivity && !mMediaPlayer.isPlaying()) {
            mMediaPlayer.prepareAsync();
            mMediaPlayer.seekTo((int) position);
            mMediaPlayer.start();
            mPauseButton.setImageResource(R.drawable.ic_media_pause);
            if(servicerunning){
                videoService.removenotification();
            }

        }
    }




 @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {

        resetPlayer();
        return false;
    }

Android 的 list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.fahadali.playerproject">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>



    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service android:enabled="true" android:name=".MusicService" >

            </service>

        <service android:enabled="true" android:name=".VideoService" >

        </service>
        <receiver android:name=".AlarmReceiver"/>


        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|screenSize"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar"
            android:launchMode="standard"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".FilesActivity"
            android:label="@string/title_activity_files"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".MediaPlayerActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:label="@string/title_activity_media_player"
            android:theme="@style/AppTheme.NoActionBar"
            android:launchMode="singleTask">
            android:screenOrientation="portrait">
        </activity>
        <activity
            android:name=".PermissionsActivity"
            android:label="@string/title_activity_permissions"
            android:theme="@style/AppTheme.NoActionBar">

        </activity>
    </application>

</manifest>

日志:

02-01 18:34:36.465 17654-17654/com.example.fahadali.playerproject E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.example.fahadali.playerproject, PID: 17654
                                                                                    java.lang.RuntimeException: Unable to resume activity {com.example.fahadali.playerproject/com.example.fahadali.playerproject.MediaPlayerActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.media.MediaPlayer.isPlaying()' on a null object reference
                                                                                        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3194)
                                                                                        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3225)
                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1506)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                        at android.os.Looper.loop(Looper.java:160)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5541)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)
                                                                                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.media.MediaPlayer.isPlaying()' on a null object reference
                                                                                        at com.example.fahadali.playerproject.MediaPlayerActivity.onResume(MediaPlayerActivity.java:1348)
                                                                                        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
                                                                                        at android.app.Activity.performResume(Activity.java:6179)
                                                                                        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3183)
                                                                                        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3225) 
                                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1506) 
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                        at android.os.Looper.loop(Looper.java:160) 
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5541) 
                                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                                        at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964) 
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759) 

我找不到任何解决方案。接下来我可以尝试什么?

最佳答案

您可以使用 pause 方法暂停媒体播放器,并记住您暂停媒体播放器的最后位置,如下所示:

Mediaplayer.pause();
length=Mediaplayer.getCurrentPosition();

然后你可以使用这个从你离开的位置恢复播放器:

Mediaplayer.seekTo(length);
Mediaplayer.start();

关于android - 从 onResume 的最后位置恢复 MediaPlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48563617/

相关文章:

java - 获取ListView高度

java - 从类对象的方法接收空指针异常

.net - 如何调用将 ArrayList 返回给 Android 的 .net Web 服务

java - 在 Pentaho 数据集成中打开任何 Kettle 转换文件时出错

java - 什么是 NullPointerException,我该如何解决?

android - 音频完成后,ProgressBar不会重置

Java : Play List of Tracks In Android MediaPlayer

android - 以编程方式设置 CardView 海拔

java - 使用复选框获取 NullPointerException

安卓媒体播放器不工作