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 に答える