gpt4 book ai didi

java - android studio 中媒体播放器的问题

转载 作者:行者123 更新时间:2023-11-29 23:23:55 25 4
gpt4 key购买 nike

我似乎无法让媒体播放器播放我应用中的音乐。我设法让它在另一个项目上工作,但似乎无法在当前项目中正确实现。每次我单击音乐选项卡时,都会导致应用程序崩溃并打印出以下错误消息。任何帮助,将不胜感激。谢谢!

package com.example.android.japaneselanguageapp;

public class Word {

/*Default translation for the word*/
private String jDefaultTranslation;
/*Japanese translation for the word*/
private String jJapaneseTranslation;

/*Image resource ID for the word*/
private int jimageResourceId = NO_IMAGE;

/*Constant to set no image state */
private static final int NO_IMAGE = -1;

/*resource id for word*/
private int mAudioId;




public Word(String defaultTranslation, String japaneseTranslation, int audioResourceId){

jDefaultTranslation = defaultTranslation;
jJapaneseTranslation = japaneseTranslation;
mAudioId = audioResourceId;

}

/*Overloaded Constructor for everything needing images*/
public Word(String defaultTranslation, String japaneseTranslation, int imageResourceId, int audioResourceId){

jDefaultTranslation = defaultTranslation;
jJapaneseTranslation = japaneseTranslation;
jimageResourceId = imageResourceId;
mAudioId = audioResourceId;
}

public int getaudioResourceId(){
return mAudioId;

}


package com.example.android.japaneselanguageapp;

import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;


import java.util.ArrayList;

public class NumbersActivity extends AppCompatActivity {

private MediaPlayer mMediaPlayer;

/*listener will be triggered when mediaplayer finishes*/
private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
// Now that the sound file has finished playing, release the media player resources.
releaseMediaPlayer();
}
};

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

/*Create an array list of words*/
final ArrayList<Word> words = new ArrayList<>();

/* the last parameter is switched by added audio files to raw folder and declaring*/
words.add(new Word("One", "Ichi", R.drawable.japanese_flag, R.raw.outkast));

WordAdapter adapter = new WordAdapter(this, words);

ListView listView = findViewById(R.id.list);

listView.setAdapter(adapter);


// Register the onClick listener with the implementation above
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Word word = words.get(position);

/*releases if currently existing, to play new media*/
releaseMediaPlayer();

mMediaPlayer = MediaPlayer.create(NumbersActivity.this, word.getaudioResourceId());
mMediaPlayer.start();

mMediaPlayer.setOnCompletionListener(mCompletionListener);

}});
}

@Override
protected void onStop() {
super.onStop();
/*when activity is stopped, releases media player so there isn't any sound being played*/
releaseMediaPlayer();
}


/* releases mediaplayer*/
private void releaseMediaPlayer() {
// If the media player is not null, then it may be currently playing a sound.
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}
}




The log cat error below:



E/MediaPlayerNative: error (1, -2147483648)
D/MediaPlayer: create failed:
java.io.IOException: Prepare failed.: status=0x1
at android.media.MediaPlayer._prepare(Native Method)
at android.media.MediaPlayer.prepare(MediaPlayer.java:1282)
at android.media.MediaPlayer.create(MediaPlayer.java:983)
at android.media.MediaPlayer.create(MediaPlayer.java:954)
at com.example.android.japaneselanguageapp.NumbersActivity$2.onItemClick(NumbersActivity.java:83)
at android.widget.AdapterView.performItemClick(AdapterView.java:318)
at android.widget.AbsListView.performItemClick(AbsListView.java:1159)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3136)
at android.widget.AbsListView$3.run(AbsListView.java:4052)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.japaneselanguageapp, PID: 17776
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
at com.example.android.japaneselanguageapp.NumbersActivity$2.onItemClick(NumbersActivity.java:84)
at android.widget.AdapterView.performItemClick(AdapterView.java:318)
at android.widget.AbsListView.performItemClick(AbsListView.java:1159)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3136)
at android.widget.AbsListView$3.run(AbsListView.java:4052)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Application terminated.

最佳答案

我知道您解决了您的问题,但以防万一我想与您分享这门课。这是一个帮助程序类,可让您在应用程序的任何位置播放声音。

所以这是类:

package com.oyduts.blindtest.Helpers;

import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.os.CountDownTimer;
import android.widget.Toast;

import java.io.Console;
import java.io.IOException;
import java.io.InputStream;

public class MediaManager
{
private static MediaPlayer _mediaPlayer;
private static Context _context;
private static int _pausedAt;
private static CountDownTimer _countDownTimer;

public static Bitmap GetBitmapFromAssets(Context c, String filename)
{
AssetManager am = c.getAssets();
InputStream is = null;
try
{
is = am.open(filename);
}
catch (IOException e)
{
e.printStackTrace();
}
return BitmapFactory.decodeStream(is);
}

public static void InitMediaPlayer(Context c)
{
_context = c;
_mediaPlayer = new MediaPlayer();
}
public static void LoadMusic(String filePath)
{
try
{
_mediaPlayer.reset();
AssetFileDescriptor afd = _context.getAssets().openFd(filePath);
_mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
_mediaPlayer.prepare();
afd.close();
}
catch (Exception e)
{
e.printStackTrace();
Toast.makeText(_context, "Couldn't load the music, please check your data folder.", Toast.LENGTH_SHORT).show();
}
}
public static void PauseMusic()
{
try
{
if (_mediaPlayer != null && _mediaPlayer.isPlaying())
{
_pausedAt = _mediaPlayer.getCurrentPosition();
_mediaPlayer.pause();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void PlayMusic()
{
try
{
if (_mediaPlayer != null && !_mediaPlayer.isPlaying()) _mediaPlayer.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void ResumeMusic()
{
try
{
if (_mediaPlayer != null && !_mediaPlayer.isPlaying())
{
_mediaPlayer.seekTo(_pausedAt);
_mediaPlayer.start();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void StopMusic()
{
try
{
if (_mediaPlayer != null && _mediaPlayer.isPlaying()) _mediaPlayer.stop();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void ReleaseMusic()
{
try
{
if (_mediaPlayer != null) _mediaPlayer.release();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

还有一个关于如何使用它的例子:

首先,在 onCreate 方法中初始化播放器:

// Init mediaplayer
MediaManager.InitMediaPlayer(this);

然后如果你想在实际播放之前加载声音:

MediaManager.LoadMusic("your_file_path");

然后您可以使用以下方式播放音乐:

MediaManager.PlayMusic();

要停止音乐:

MediaManaer.StopMusic();

您也可以恢复音乐(例如,在 onResume 方法中):

MediaManager.ResumeMusic();

最后,不要忘记在最后释放播放器:

MediaManager.ReleaseMusic();

您还可以根据需要修改此类。

编辑顺便说一句,你的音频文件应该在你的应用程序的 Assets 文件夹中

最好的问候

关于java - android studio 中媒体播放器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53835488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com