3

私は本当にAndroidとJavaが初めてです。作成中のアプリにはメディア サービスがあり、着信時にメディアを停止または一時停止したいと考えています。これは私のメディア サービス コードです

public class ServiceMusic は Service {

MediaPlayer music;

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

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

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);

    if (music !=null)
    music.stop();

    music = MediaPlayer.create(ServiceMusic.this, R.raw.music);
    music.start();
    music.setLooping(true);
}

}

これについて私を助けていただければ、本当に感謝しています. ありがとう

4

1 に答える 1

5

以下のように、着信コールのレシーバーを作成する必要があります。

public class call_reciver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        String number = "";
        Bundle bundle = intent.getExtras();


        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            // Phone is ringing
            number = bundle.getString("incoming_number");


        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            // Call received

        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            // Call Dropped or rejected


        }


    }

マニフェストにこれを入れます:

<receiver android:name=".call_reciver" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>

許可 :

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

メディアプレーヤー変数を静的およびグローバルにし、受信者で別のサービスを呼び出して、メディアプレーヤーが実行されているかどうかを確認します。実行中の場合は停止します。も同様のサービスをご利用いただけます。

レシーバーからサービスを開始する必要があります。

Intent myIntent = new Intent(context, Service_temp.class);
        context.startService(myIntent);

サービスではこれを使用します:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        return super.onStartCommand(intent, flags, startId);
    }

編集された ans を確認してください:

以下の例では、すべてのことを行いました。サービスで曲を再生するボタンが 1 つあります。その時点で、あなたは着信を受信すると、サービスを停止し(曲の再生を停止します)、通話を拒否またはドロップすると、再び曲の再生を開始します

メイン アクティビティ クラス :

package com.example.androidmediaplay;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void clickBtn(View v) {
        if (v.getId() == R.id.button1) {
            UtilClass.playing = true;
            Intent i = new Intent(MainActivity.this,
                    BackgroundSoundService.class);
            startService(i);
        }
    }

}

BackgroundSoundService クラス:

package com.example.androidmediaplay;

import java.io.File;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;

public class BackgroundSoundService extends Service {

    private static final String TAG = null;
    MediaPlayer player;

    public IBinder onBind(Intent arg0) {

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(
                this,
                Uri.fromFile(new File(Environment.getExternalStorageDirectory()
                        + "/Songs/test.mp3")));
        player.setLooping(true); // Set looping
        player.setVolume(100, 100);

    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("onStartCommand", "onStartCommand");
        if (player.isPlaying()) {
            player.pause();
            UtilClass.pause = true;

            Log.e("onStartCommand pause", "onStartCommand pause");
        } else {
            UtilClass.pause = false;
            player.start();
        }

        return 1;
    }

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

    public IBinder onUnBind(Intent arg0) {
        // TO DO Auto-generated method
        return null;
    }

    public void onStop() {

    }

    public void onPause() {

    }

    @Override
    public void onDestroy() {
        UtilClass.playing = false;
        player.stop();
        player.release();
    }

    @Override
    public void onLowMemory() {

    }

}

コール レシーバー クラス:

package com.example.androidmediaplay;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;
import android.util.Log;

public class call_reciver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        String number = "";
        Bundle bundle = intent.getExtras();

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            // Phone is ringing
            number = bundle.getString("incoming_number");
            Log.e("incoming_number", "incoming_number");
            _stopServices(context);

        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            // Call received

        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            // Call Dropped or rejected
            _stopServices(context);
        }

    }

    private void _stopServices(Context con) {
        // TODO Auto-generated method stub
        if (UtilClass.playing == true) {
            Log.e("start services", "start services");
            Intent i = new Intent(con, BackgroundSoundService.class);
            con.startService(i);
        } else {
            Log.e("start not services", "start not services");
        }
    }

}

静的メンバーの追加クラス:

package com.example.androidmediaplay;

public class UtilClass {

    public static Boolean playing = false;
    public static boolean pause = false;
}

最後のマニフェスト ファイル:

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

    <uses-sdk
        android:minSdkVersion="8"
        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.example.androidmediaplay.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <service
            android:name=".BackgroundSoundService"
            android:enabled="true" >
        </service>

        <receiver android:name=".call_reciver" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

すべてのコードは私の最後で機能しています。確認して教えてください。

于 2013-02-15T05:58:26.193 に答える