在Android应用中播放背景音乐

14

我想在我做的应用程序中播放背景音乐。请帮助我如何实现?以下是完整的代码。

public class Numbers extends Activity {
    public static MediaPlayer mp = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_numbers);
        ViewPager viewPager = (ViewPager)findViewById(R.id.view_pager);
        ImagePagerAdapter adapter = new ImagePagerAdapter();
        viewPager.setAdapter(adapter);
    }

    private class ImagePagerAdapter extends PagerAdapter {
        private int[] mImages = new int[]{R.drawable.no1,R.drawable.no2,R.drawable.no3,R.drawable.no4,R.drawable.no5,R.drawable.no6,R.drawable.no7,R.drawable.no8,R.drawable.no9};

        @Override
        public int getCount() {
            return mImages.length;
        }
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == ((ImageView) object);
        }
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Context context = Numbers.this;
            ImageView imageView = new ImageView(context);
            int padding =context.getResources().  
            getDimensionPixelSize(R.dimen.activity_vertical_margin);
            imageView.setPadding(padding, padding, padding, padding);
            imageView.setScaleType(ImageView.ScaleType.CENTER);
            imageView.setImageResource(mImages[position]);
            ((ViewPager) container).addView(imageView, 0);

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                ((ViewPager) container).removeView((ImageView) object);
            }
        }
    }//end of sub-class ImagePagerAdapter
}//End of Numbers class

告诉我需要在这段代码中添加什么,以播放背景音乐,并将其设置为循环模式直到应用程序运行结束。

4个回答

22

此内容在Android Studio 2.2.3中测试通过。

1)首先将您的music.mp3复制并粘贴到app.res.raw中。

2)将服务设置为像这样的AndroidManifest.xml

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    :
    :
    <service android:name=".SoundService"  android:enabled="true"></service>
</application>

3) 添加SoundService.java文件,其中包含以下代码:

package com.jahanweb.ring;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class SoundService extends Service {
    MediaPlayer player;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public void onCreate() {
        player = MediaPlayer.create(this, R.raw.music); //select music file
        player.setLooping(true); //set looping
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return Service.START_NOT_STICKY;
    }

    public void onDestroy() {
        player.stop();
        player.release();
        stopSelf();
        super.onDestroy();
    }

}

4) 在活动中使用它如下:

package com.jahanweb.ring;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        //start service and play music
        startService(new Intent(MainActivity.this, SoundService.class));

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    protected void onDestroy() {
        //stop service and stop music
        stopService(new Intent(MainActivity.this, SoundService.class));
        super.onDestroy();
    }
}

我有一个游戏的 SplashScreen 类,在这个类中会播放音乐。然后屏幕会切换到其他屏幕,游戏开始。我仍然希望音乐在后台播放(实际上也是这样),但当我最小化游戏时,音乐仍然会继续播放,唯一停止它的方法是通过任务管理器结束应用程序。如何解决这个问题? - Raskoljnikovic
@Raskoljnikovic,如果您开一个新的问题可能会更好。 - Nabi K.A.Z.

18

最好将您的媒体代码放在服务中。 这是在后台播放媒体的最佳方式。

public class serv extends Service{

    MediaPlayer mp;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    public void onCreate()
    {   
        mp = MediaPlayer.create(this, R.raw.b);
        mp.setLooping(false);
    }
    public void onDestroy()
    {       
        mp.stop();
    }
    public void onStart(Intent intent,int startid){

        Log.d(tag, "On start");
        mp.start();
    }
}

其中raw是在资源中创建的文件夹,R.raw.b是一个mp3文件。


3
这个从Activity中如何调用? - Si8
能否在后台播放从API接收的音频,而不是从原始文件夹中播放? - SKK
我想要做的是,用户将打开我的应用程序。应用程序将从服务器侦听某些内容。如果服务器发送音频,则应用程序应该即使屏幕锁定也能播放它。这可能吗? - SKK

5
MediaPlayer  player = MediaPlayer.create(this,  R.raw.music);
player.setLooping(true); // Set looping
player.setVolume(100,100);

public int onStartCommand(Intent intent, int flags, int startId) {
    player.start();
    return 1;
}

@Override
public void onDestroy() {
    player.stop();
    player.release();
}

public void onStart(Intent intent, int startId) 
{
    // TODO
}

我在 @nabi-k-a-z 的上面的例子中尝试了你的 setVolume 命令,但没有效果。我用这个解决了:https://dev59.com/iG435IYBdhLWcg3wyzMJ#12197453 - rubo77

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接