相关疑难解决方法(0)

MediaPlayer.prepareAsync的IllegalStateException

05-19 11:52:51.622: ERROR/MediaPlayer(1291): prepareAsync called in state 8
05-19 11:52:51.622: WARN/System.err(1291): java.lang.IllegalStateException
Run Code Online (Sandbox Code Playgroud)
try {
    mp = MediaPlayer.create(
            Main.this,
            Uri.parse("http://codejanitor.us/good.mp3"));
    mp.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
    try {
        mp.prepareAsync();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }
} finally {
    if (mp != null) {
        mp.release();
        mp = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

交替

如果我做:

try {
    mp = MediaPlayer.create(
            AmazonClipActivity.this,
            Uri.parse("http://codejanitor.us/good.mp3"));
    mp.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
} finally {
    if …
Run Code Online (Sandbox Code Playgroud)

android android-mediaplayer

34
推荐指数
3
解决办法
4万
查看次数

在MediaPlayer中将数据源设置为原始ID

在MediaPlayer.create方法中,可以使用到Raw文件的id但是如何在setDataSource方法中使用它?

android android-mediaplayer

30
推荐指数
3
解决办法
3万
查看次数

MediaPlayer.setDataSource(String)不使用本地文件

如果我使用静态方法MediaPlayer.create(context,id),我可以播放本地mp3,但是如果我使用非静态方法MediaPlayer.setDataSource(String)则它不起作用.发生的事情是我在调用MediaPlayer.prepare()时遇到同步异常:

prepare exceptionjava.io.IOException: Prepare failed.: status=0x1

这是我的代码(省略日志记录):

String filename = "android.resource://" + this.getPackageName() + "/raw/test0";

mp = new MediaPlayer();
try { mp.setDataSource(filename); } catch (Exception e) {}
try { mp.prepare(); } catch (Exception e) {}
mp.start();
Run Code Online (Sandbox Code Playgroud)

请注意,我没有收到有关未找到文件或任何内容的错误.该文件的全名是test0.mp3,我将它放在Eclipse的/ res/raw /目录中.

我假设我正在设置错误的路径,但我在网上找到的所有示例都使用setDescriptor版本的setDataPath而不是setDataPath的String版本.

编辑:如果我使用方法MediaPlayer.setDataSource(FileDescriptor)并将文件放在Eclipse中的/ assets /目录中,我也可以播放本地mp3.

编辑#2:我接受了这是不可能的答案,但后来意识到我正在使用的库(openFrameworks)确实使用String方法来加载文件.看这里:

https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxAndroid/ofAndroidLib/src/cc/openframeworks/OFAndroidSoundPlayer.java

java android android-mediaplayer

29
推荐指数
1
解决办法
3万
查看次数

Android MediaPlayer - 如何在STREAM_ALARM中播放?

我已经尝试使用以下代码在我的应用程序中设置媒体播放器的音频流,但是当我这样做时,我在模拟器中听不到声音.如果我没有为播放器设置流,则音频播放正常.我确定我使用这个错误但不能锻炼如何,任何帮助?

MediaPlayer player = MediaPlayer.create(getApplicationContext(), R.raw.test_audio);

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.start();
Run Code Online (Sandbox Code Playgroud)

注意:我已经为我的清单添加了MODIFY_AUDIO_SETTINGS权限.

谢谢!

android stream media-player android-audiomanager

12
推荐指数
3
解决办法
8403
查看次数

如何使用带有setAudioAttributes的警报音量播放铃声?

所以我试图围绕音频属性.这是我到目前为止所拥有的:

// alarm.getSound() will return a proper URI to pick a ringtone
Ringtone tone = RingtoneManager.getRingtone(this, alarm.getSound());
if (Build.VERSION.SDK_INT >= 21) {
    AudioAttributes aa = new AudioAttributes.Builder()
        .setFlags(AudioAttributes.USAGE_ALARM | AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .build();
    tone.setAudioAttributes(aa);
} else {
    tone.setStreamType(RingtoneManager.TYPE_ALARM);
}
tone.play();
Run Code Online (Sandbox Code Playgroud)

本页讨论音频属性及其"兼容性映射".如果我以前使用过setStreamType(TYPE_ALARM)(就像我上面那样)那么它将设置CONTENT_TYPE_SONIFICATIONUSAGE_ALARM标志.我想离开,setStreamType所以我想如果我手动设置那些标志(就像我在上面)那么当铃声播放时它将使用警报音量.好吧,它似乎并没有像那样工作.

上面的代码仍然使用我的Nexus 6的媒体音量而不是警报音量.我在6.0版本中使用了MRA68N.使用Alarm音量可以做些什么?

audio android

6
推荐指数
1
解决办法
3184
查看次数

媒体播放器准备显示非法状态例外

我正在尝试从内部存储播放音频文件.我用的代码是......

package com.abhi.firstapp.firstapp;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.net.URI;

public class MainActivity extends AppCompatActivity {

     MediaPlayer mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);



    File f= new File("/sdcard/a.mp3");
    if(f.exists())
    {

        Toast toast= Toast.makeText(this, "file exists", Toast.LENGTH_LONG);
        toast.show();
        Log.d("uri","1");
        Uri uri= Uri.fromFile(f);
        Log.d("uri", "2"); …
Run Code Online (Sandbox Code Playgroud)

android media-player illegalstateexception android-mediaplayer

2
推荐指数
2
解决办法
6587
查看次数

Android:在闹钟上播放自己的声音

我的应用程序有闹钟功能。我的要求是在闹钟响起时播放自己的声音,但我无法做到这一点。仅当警报响起时才显示通知。我要播放的声音文件位于 Res 的 raw 文件夹内。下面我发布我的代码:

在我的活动课上:

Intent AlarmIntent = new Intent(getApplicationContext(), AlarmReceiver.class);
        AlarmIntent.putExtra("Ringtone", 
                Uri.parse("getResources().getResourceName(R.raw.shankh_final_mid)"));
        PendingIntent Sender = PendingIntent.getBroadcast(this, 0, AlarmIntent, 0);
        AlarmManager AlmMgr = (AlarmManager)getSystemService(ALARM_SERVICE);
        AlmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 
                (60 * 1000), (24 * 60 * 60 * 1000), Sender);
Run Code Online (Sandbox Code Playgroud)

在接收器类中:

public void onReceive(Context context, Intent intent) { 

    Intent in = new Intent(context, SnoozeEvent.class);
    in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent Sender = PendingIntent.getActivity(context, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
    manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    notification = new Notification(R.drawable.icon, "Wake up alarm", System.currentTimeMillis());
    notification.setLatestEventInfo(context, "Hanuman Chalisa", "Wake Up...", Sender);
    notification.flags = …
Run Code Online (Sandbox Code Playgroud)

android alarmmanager

1
推荐指数
1
解决办法
1万
查看次数