1

我正在使用 Android 中的媒体播放器进行音频演示。当我旋转模拟器的屏幕时,我只需要播放一次歌曲。但是当我实现这个应用程序并旋转屏幕时,按下 Ctrl+F10 或 Ctrl+F11 按钮进行横向和纵向我面临的问题我的歌曲正在播放以再次开始我开始旋转歌曲是一次又一次地开始双重和双重。这是我的代码。

public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.audio);
        init();
        imgVw.setImageResource(R.raw.teddy_two);

        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        final SharedPreferences.Editor prefsEdit = prefs.edit();

        mp = MediaPlayer.create(Audio_Activity.this,R.raw.issaq_tera_by_vishu);
        mp.setLooping(false);
        btnChapter.setEnabled(false);
        prefsEdit.putBoolean("mediaplaying", true);
        prefsEdit.commit();
        mp.start();

        System.out.println("Media Plyer Is Start !!!");




        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub

                System.out.println("Media Plyer Is Complete !!!");

                /*final SharedPreferences.Editor prefsEdit = prefs.edit();
                prefsEdit.putBoolean("mediaplaying", false);
                prefsEdit.commit();*/
                btnChapter.setEnabled(true);
                System.out.println("Music is over and Button is enable !!!!!!");
                //mp.start();
            }
        });


        @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }

}

我在 res 目录的 layout-land 文件夹中添加了 audio.xml 文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/display_Images"
        android:layout_width="fill_parent"
        android:layout_height="260dp"
        android:background="@android:color/black" />

    <TableLayout
        android:id="@+id/table_Audio"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="300dp" >

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/btnPause_Resume"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/audio" />

            <Button
                android:id="@+id/btnChapter"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/chapter" >
            </Button>
        </TableRow>


    </TableLayout>

</RelativeLayout>

这是我的 AndroidMeniFest.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.audio_demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.audio_demo.Audio_Activity"

            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
4

2 回答 2

0

管理MediaPlayer内部Activity环境不是一个好主意。onCreate每次配置更改时都会调用您的。它还在那里泄漏内存。

对于一个快速、肮脏但不是最糟糕的解决方案,创建Application子类,将该代码移动到那里的一个函数并只调用该函数一次,例如从Application.onCreate.

如果要控制从 开始Activity,请使用:

MyApp app = (MyApp) getApplication();
app.methodStartingPlayback();

并确保你保护里面的电话MyApp

private boolean playing = false;

public void methodStartingPlayback() {
    if (playing) {
        return;
    }
    playing = true;
    // ...
}

要获得更好的解决方案,请使用Service来控制播放。

于 2013-07-20T07:50:45.877 回答
0

我相信 MaciejGórski 的意思是在播放音乐之前添加一个标志来检查音乐是否正在播放。所以你有一个名为“playing”的变量并将其实例化为false。然后在你打开声音的地方,检查标志是否为假,如果是,打开音乐并打开标志。取出音乐控制位并放入一个方法,如下(使用MacieGorski的代码作为基础)

private boolean playing = false;

 public void methodStartingPlayback() 
 {
  if (!playing) 
   {
     mp = MediaPlayer.create(Audio_Activity.this,R.raw.issaq_tera_by_vishu);
     mp.setLooping(false);
     btnChapter.setEnabled(false);
     prefsEdit.putBoolean("mediaplaying", true);
     prefsEdit.commit();
     playing = true;
     mp.start();
  }
    //playing = true;
   // ...
 }

作为替代方案,或者另外,您应该让 onDestroy 方法终止音乐,如下所示(归功于 Lars Vorgel 的教程,我现在找不到链接。)

 @Override
protected void onDestroy() {
    super.onDestroy();
    // TODO Auto-generated method stub
    if (mp != null) {
        mp.release();
        mp = null;
    }

}

希望这可以帮助

于 2013-10-28T17:14:26.270 回答