Android closes media service on incoming call
I am really new to Android and java. I am making an application and it has a media service and I want the media to be paused or suspended on incoming calls. This is my support code
public class ServiceMusic extends 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);
}
}
I will be very grateful if you can help me with this, and if you can give me full instructions, it will be great. Thanks to
source to share
you need to create a receiver for the incoming call as shown below:
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
}
}
in your manifest put this:
<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>
make your media player variable static and global, in the repeater call another service to check if your media player is running or not. if it's running, stop it. you can use the same service as well.
you need to start the services on the receiver:
Intent myIntent = new Intent(context, Service_temp.class);
context.startService(myIntent);
in the service use this:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
check changed ans:
In the example below, I've done everything. there is one button that will play the song. at that time you receive an incoming call, then it will stop your service (stop playing the song), and when you reject or release the call, it will start playing the song again
main Activity class:
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 class:
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() {
}
}
calling the receiver class:
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");
}
}
}
additional class for static member:
package com.example.androidmediaplay;
public class UtilClass {
public static Boolean playing = false;
public static boolean pause = false;
}
in the last manifest file:
<?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>
All code works from my side. please check it and tell me.
source to share