播放MP3 Android上的MediaPlayer问题类 [英] play an mp3 with MediaPlayer class on Android issues

查看:265
本文介绍了播放MP3 Android上的MediaPlayer问题类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是错我的code?我有一个切换按钮,我想以播放/停止MP3。我猜测,code应该如下:

 包com.android.iFocus;
进口android.app.Activity;
进口android.media.MediaPlayer;
进口android.os.Bundle;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.ToggleButton;公共类iFocusActivity扩展活动实现OnClickListener {
    公众诠释计数;
    MediaPlayer的媒体播放器= MediaPlayer.create(这一点,R.raw.rain);    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);        切换按钮toggleR​​ain =(切换按钮)findViewById(R.id.toggleR​​ain);        //定义监听器
        toggleR​​ain.setOnClickListener(本);        计数= 0;
    }
    @覆盖
    公共无效的onClick(查看toggleR​​ain){
        如果(计数== 0){            mediaPlayer.start();
            数= 1;
        }其他{
            //的MediaPlayer媒体播放器= MediaPlayer.create(这一点,R.raw.rain);
                    mediaPlayer.pause();
            mediaPlayer.stop();
                    mediaPlayer.release();
            计数= 0;
        }    }}

问题是:Eclipse不给任何错误,但在模拟器/手机它给了我一个异常和模具立即启动后。这里有云:

  20 10-02:28:24.312:信息/ ActivityManager(59):启动活动:意向{行动= android.intent.action.MAIN猫= [android.intent.category .LAUNCHER] FLG = 0x10000000的CMP = com.android.iFocus / .iFocusActivity}
10-02 20:28:24.392:DEBUG / AndroidRuntime(960):关闭VM
10-02 20:28:24.402:DEBUG / dalvikvm(960):调试器分离;对象注册了1项
10-02 20:28:24.462:信息/ ActivityManager(59):启动PROC com.android.iFocus的活动com.android.iFocus / .iFocusActivity:PID = 967 UID = 10036导报= {}
10-02 20:28:24.502:信息/ AndroidRuntime(960):注:连接线的捆扎线#3'失败
10-02 20:28:25.822:DEBUG / AndroidRuntime(967):关闭VM
10-02 20:28:25.822:WARN / dalvikvm(967):主题ID = 1:螺纹未捕获的异常退出(组= 0x4001d800)
10-02 20:28:25.932:ERROR / AndroidRuntime(967):致命异常:主要
10-02 20:28:25.932:ERROR / AndroidRuntime(967):了java.lang.RuntimeException:无法实例活动ComponentInfo {com.android.iFocus / com.android.iFocus.iFocusActivity}:显示java.lang.NullPointerException

那么,当我初始化的onClick内部类里面的媒体播放器,它并没有给我任何错误,并且aplication不给我开始这首歌的任何错误。但它不会停止也应。所以,当我点击切换按钮,它开始,当我再次点击,它不会做任何事情,但给我的日志猫的错误:

错误时,第一个preSS切换按钮和歌曲开始确定(但给这个错误):

  20 10-02:39:02.712:信息/ ActivityManager(59):启动PROC com.android.iFocus的活动com.android.iFocus / .iFocusActivity:PID = 996 UID = 10036导报= {}
10-02 20:39:02.782:信息/ AndroidRuntime(989):注:连接线的捆扎线#3'失败
10-02 20:39:04.432:信息/ ActivityManager(59):显示活动com.android.iFocus / .iFocusActivity 1804毫秒(共640049毫秒)
10-02 20:39:08.672:调试/ AudioSink(34):bufferCount(4)太小而增加到12
10-02 20:39:08.982:WARN / AudioFlinger(34):写阻塞73毫秒,2105延迟写入,螺纹0xb3b8
10-02 20:39:09.682:DEBUG / dalvikvm(437):GC_EXPLICIT释放686对象/ 38192字节216ms
10-02 20:39:14.502:WARN / AudioFlinger(34):写阻塞86毫秒,2110延迟写入,螺纹0xb3b8
10-02 20:39:14.642:DEBUG / dalvikvm(188):GC_EXPLICIT释放164对象/ 11408字节176ms
10-02 20:39:19.622:DEBUG / dalvikvm(261):GC_EXPLICIT释放在154ms 43的对象/ 1912年字节
10-02 20:39:20.352:WARN / AudioFlinger(34):写阻塞78毫秒2119延迟写入,螺纹0xb3b8

当我再次preSS切换按钮和歌曲错误应停止:

  20 10-02:43:22.412:ERROR / MediaPlayer的(1032):叫暂停状态8
10-02 20:43:22.412:ERROR / MediaPlayer的(1032):错误(-38,0)
10-02 20:43:22.412:ERROR / MediaPlayer的(1032):停止状态称为0
10-02 20:43:22.412:ERROR / MediaPlayer的(1032):错误(-38,0)
10-02 20:43:22.612:WARN / MediaPlayer的(1032):媒体播放器与未处理的事件就走了
10-02 20:43:22.612:WARN / MediaPlayer的(1032):媒体播放器与未处理的事件就走了
10-02 20:43:22.622:WARN / MediaPlayer的(1032):媒体播放器与未处理的事件就走了
10-02 20:43:22.622:WARN / MediaPlayer的(1032):媒体播放器与未处理的事件就走了


解决方案

第一件事,第一,我的分析:
1.你没有初始化里面的onCreate()的MediaPlayer的:

 的MediaPlayer媒体播放器= MediaPlayer.create(这一点,R.raw.rain);

这个'< ---这个东西是NULL,因此你在运行时,首先加载应用程序定时一个NullPointerException异常。

2。在第二次点击按钮,你叫

  mediaPlayer.release();

和您下一次单击,在MediaPlayer的国家例外

好了,解决方法是pretty多简单,你需要考虑在Android编程的最佳实践:

 包pete.android.study;进口android.app.Activity;
进口android.media.MediaPlayer;
进口android.os.Bundle;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.ToggleButton;公共类主要活动扩展实现OnClickListener {
        //声明管制
        公众诠释计数= 0;
        的MediaPlayer媒体播放器= NULL;
        切换按钮toggleR​​ain = NULL;
        / *
         *(非Javadoc中)
         * @see android.app.Activity#的onCreate(android.os.Bundle)
         * /
        @覆盖
        公共无效的onCreate(捆绑savedInstanceState){
            //负荷布局
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.main);
            //负荷控制
            toggleR​​ain =(切换按钮)findViewById(R.id.toggleR​​ain);
            //初始化播放器
            媒体播放器= MediaPlayer.create(这一点,R.raw.rain);
            //设置click事件处理程序
            toggleR​​ain.setOnClickListener(本);
            //用于播放初始状态
            计数= 0;
        }        / *
         *(非Javadoc中)
         * @see android.view.View.OnClickListener#的onClick(android.view.View)
         * /
        @覆盖
        公共无效的onClick(查看toggleR​​ain){
            如果(计数== 0){
                mediaPlayer.start();
                数= 1;
            }其他{
                mediaPlayer.pause();
                计数= 0;
            }
        }        / *
         *(非Javadoc中)
         * @see android.app.Activity#的onDestroy()
         * /
        @覆盖
        保护无效的onDestroy(){
            如果(媒体播放器!= NULL){
                mediaPlayer.stop();
                mediaPlayer.release();
                媒体播放器= NULL;
            }
        }}

当然,它的工作方式类似魅力^^!
然而,有许多方法来改善这个简单的应用程序,我想你可以通过查看过的Andr​​oid开发者参考文档找出:)

What is wrong with my code? I have a toggle button and i would like to play/stop an mp3. I guess that the code should be as follows:

package com.android.iFocus;


import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ToggleButton;

public class iFocusActivity extends Activity implements OnClickListener {
    public int count;
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain);

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ToggleButton toggleRain = (ToggleButton)findViewById(R.id.toggleRain);

        //Define Listeners
        toggleRain.setOnClickListener(this);

        count = 0;


    }


    @Override    
    public void onClick(View toggleRain) {


        if(count==0){

            mediaPlayer.start();
            count=1;
        } else {
            //MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain);
                    mediaPlayer.pause();
            mediaPlayer.stop();
                    mediaPlayer.release();
            count=0;
        }

    }

}

the problem is: Eclipse doesn't give any error, but on emulator/phone it gives me an exception and die immediately after started. here goes:

10-02 20:28:24.312: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.android.iFocus/.iFocusActivity }
10-02 20:28:24.392: DEBUG/AndroidRuntime(960): Shutting down VM
10-02 20:28:24.402: DEBUG/dalvikvm(960): Debugger has detached; object registry had 1 entries
10-02 20:28:24.462: INFO/ActivityManager(59): Start proc com.android.iFocus for activity com.android.iFocus/.iFocusActivity: pid=967 uid=10036 gids={}
10-02 20:28:24.502: INFO/AndroidRuntime(960): NOTE: attach of thread 'Binder Thread #3' failed
10-02 20:28:25.822: DEBUG/AndroidRuntime(967): Shutting down VM
10-02 20:28:25.822: WARN/dalvikvm(967): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-02 20:28:25.932: ERROR/AndroidRuntime(967): FATAL EXCEPTION: main
10-02 20:28:25.932: ERROR/AndroidRuntime(967): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.android.iFocus/com.android.iFocus.iFocusActivity}: java.lang.NullPointerException

Well, when i initialize mediaPlayer inside onClick inner class, it doesn't give me any error and the aplication doesn't give me any error for to start the song. but it does not stop as should. So, when i click on toggleButton, it starts, when i click again, it doesn't do anything but give me an error on log cat:

Error when first press toggle button and the song starts ok (but give this error):

10-02 20:39:02.712: INFO/ActivityManager(59): Start proc com.android.iFocus for activity com.android.iFocus/.iFocusActivity: pid=996 uid=10036 gids={}
10-02 20:39:02.782: INFO/AndroidRuntime(989): NOTE: attach of thread 'Binder Thread #3' failed
10-02 20:39:04.432: INFO/ActivityManager(59): Displayed activity com.android.iFocus/.iFocusActivity: 1804 ms (total 640049 ms)
10-02 20:39:08.672: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12
10-02 20:39:08.982: WARN/AudioFlinger(34): write blocked for 73 msecs, 2105 delayed writes, thread 0xb3b8
10-02 20:39:09.682: DEBUG/dalvikvm(437): GC_EXPLICIT freed 686 objects / 38192 bytes in 216ms
10-02 20:39:14.502: WARN/AudioFlinger(34): write blocked for 86 msecs, 2110 delayed writes, thread 0xb3b8
10-02 20:39:14.642: DEBUG/dalvikvm(188): GC_EXPLICIT freed 164 objects / 11408 bytes in 176ms
10-02 20:39:19.622: DEBUG/dalvikvm(261): GC_EXPLICIT freed 43 objects / 1912 bytes in 154ms
10-02 20:39:20.352: WARN/AudioFlinger(34): write blocked for 78 msecs, 2119 delayed writes, thread 0xb3b8

Error when i again press the toggleButton and the song should stop:

10-02 20:43:22.412: ERROR/MediaPlayer(1032): pause called in state 8
10-02 20:43:22.412: ERROR/MediaPlayer(1032): error (-38, 0)
10-02 20:43:22.412: ERROR/MediaPlayer(1032): stop called in state 0
10-02 20:43:22.412: ERROR/MediaPlayer(1032): error (-38, 0)
10-02 20:43:22.612: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events
10-02 20:43:22.612: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events
10-02 20:43:22.622: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events
10-02 20:43:22.622: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events

解决方案

First thing first, my analysis: 1. You didn't init the MediaPlayer inside onCreate():

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain);

'this' <--- this thing is NULL, so you've got a NullPointerException at Runtime, first loading app timing.
2. On second click to button, you've called

mediaPlayer.release();

And next time you click, exception at MediaPlayer State

Well, the fix is pretty much simple, you need to consider best practice on Android programming:

package pete.android.study;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ToggleButton;

public class Main extends Activity implements OnClickListener {
        // declare controls
        public int count = 0;
        MediaPlayer mediaPlayer = null;  
        ToggleButton toggleRain = null;
        /*
         * (non-Javadoc)
         * @see android.app.Activity#onCreate(android.os.Bundle)
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            // load layout
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            // load controls
            toggleRain = (ToggleButton)findViewById(R.id.toggleRain);
            // init player
            mediaPlayer = MediaPlayer.create(this, R.raw.rain);
            // set click event handler
            toggleRain.setOnClickListener(this);
            // init state for playing
            count = 0;
        }

        /*
         * (non-Javadoc)
         * @see android.view.View.OnClickListener#onClick(android.view.View)
         */
        @Override    
        public void onClick(View toggleRain) {
            if(count == 0){
                mediaPlayer.start();
                count = 1;
            } else {
                mediaPlayer.pause();                
                count = 0;
            }
        }

        /*
         * (non-Javadoc)
         * @see android.app.Activity#onDestroy()
         */
        @Override
        protected void onDestroy() {
            if(mediaPlayer != null) {
                mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        }

}

Certainly it works like charm ^^! There are many ways to improve this simple app, however, I guess you can find out by looking over Android Developers' References Documentation :)

这篇关于播放MP3 Android上的MediaPlayer问题类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆