Android应用开发实例篇(2)-----挂接电震动
2012-10-16 16:14
337 查看
一、概述
Android原生自带的电话软件是不支持挂接电震动设置的,但很多时候我们却需要这功能,要实现这功能有两种可行的办法,一是修改电话软件的代码,二是使用第三方软件,在这里我利用的是第二种方法。我们知道,Android提供给了开发者通过API直接监听到的三种电话状态:CALL_STATE_IDLE、CALL_STATE_OFFHOOK和CALL_STATE_RINGING,网上有很多文章对这三种状态进行了说明,但具体哪种STATE对应于实际中的哪个状态却很少提到,下面进行说明。
电话一开始所处的状态无非就两种:去电和来电。下面的图片是来电和去电的流程图。
来电和去电的流程非常相似,图中蓝色字体的英文字母就是对应于API里的三种状态,关键的状态是OFFHOOK,通过仔细观察流程可以知道,如果先有RINGING状态再有OFFHOOK状态的话就处于来电;如果先有OFFHOOK的话就处于去电,在程序里可以通过一个标志位区分它们。实现中是通过一个boolean变量,初始化为false,在检测到RINGING状态时将变量置为true,在IDLE状态将它置为false,最后通过用户的设置共同决定是否震动。或许有人埋怨为什么Android只提供三种状态,其实通过这三种状态再结合一些标志变量就可以检测到电话处于任何一种状态。如果Android什么功能都提供了,那程序员靠什么吃饭?呵呵,开玩笑的。关于开机自动启动怎么实现就不说了,网上有一大堆文章。利用SharedPreferences保存用户的设置。
[b]二、功能[/b]
1、支持挂、接电震动设置(还没实现主叫接通震动)
2、开机自动运行
[b]三、实现[/b]
本程序主要由4个java源文件组成,VibrationMainActivity.java、PhoneReceiver.java、VibrationService.java和BootReceiver.java。
VibrationMainActivity.java提供界面给用户设置;PhoneReceiver.java监听接收电话状态改变并根据设置决定是否震动;VibrationService.java后台服务,负责注册和注销电话状态改变接收者(PhoneReceiver);BootReceiver.java监听开机信息并启动服务。
代码都很简单,直接上代码,最后注意一下权限。
VibrationMainActivity.java文件:
VibrationService.java文件:
PhoneReceiver.java文件
BootReceiver.java文件
最后,AndroidManifest.xml文件
真机运行时:
PS:
本人在原生Android4.1.2的galaxy nexus(三星I9250)上亲测可用。
Android原生自带的电话软件是不支持挂接电震动设置的,但很多时候我们却需要这功能,要实现这功能有两种可行的办法,一是修改电话软件的代码,二是使用第三方软件,在这里我利用的是第二种方法。我们知道,Android提供给了开发者通过API直接监听到的三种电话状态:CALL_STATE_IDLE、CALL_STATE_OFFHOOK和CALL_STATE_RINGING,网上有很多文章对这三种状态进行了说明,但具体哪种STATE对应于实际中的哪个状态却很少提到,下面进行说明。
电话一开始所处的状态无非就两种:去电和来电。下面的图片是来电和去电的流程图。
来电和去电的流程非常相似,图中蓝色字体的英文字母就是对应于API里的三种状态,关键的状态是OFFHOOK,通过仔细观察流程可以知道,如果先有RINGING状态再有OFFHOOK状态的话就处于来电;如果先有OFFHOOK的话就处于去电,在程序里可以通过一个标志位区分它们。实现中是通过一个boolean变量,初始化为false,在检测到RINGING状态时将变量置为true,在IDLE状态将它置为false,最后通过用户的设置共同决定是否震动。或许有人埋怨为什么Android只提供三种状态,其实通过这三种状态再结合一些标志变量就可以检测到电话处于任何一种状态。如果Android什么功能都提供了,那程序员靠什么吃饭?呵呵,开玩笑的。关于开机自动启动怎么实现就不说了,网上有一大堆文章。利用SharedPreferences保存用户的设置。
[b]二、功能[/b]
1、支持挂、接电震动设置(还没实现主叫接通震动)
2、开机自动运行
[b]三、实现[/b]
本程序主要由4个java源文件组成,VibrationMainActivity.java、PhoneReceiver.java、VibrationService.java和BootReceiver.java。
VibrationMainActivity.java提供界面给用户设置;PhoneReceiver.java监听接收电话状态改变并根据设置决定是否震动;VibrationService.java后台服务,负责注册和注销电话状态改变接收者(PhoneReceiver);BootReceiver.java监听开机信息并启动服务。
代码都很简单,直接上代码,最后注意一下权限。
VibrationMainActivity.java文件:
package com.nan.vibration; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.view.Menu; import android.widget.CheckBox; import android.widget.CompoundButton; public class VibrationMainActivity extends Activity { private CheckBox handOnCheckBox = null; private CheckBox handUpCheckBox = null; final Intent mIntent = new Intent(); private SharedPreferences mSharedPreferences = null; private SharedPreferences.Editor mEditor = null; //记录用户设置(接通和挂断) boolean handon = false; boolean handup = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_vibration_main); handOnCheckBox = (CheckBox)findViewById(R.id.hand_on_checkBox); handUpCheckBox = (CheckBox)findViewById(R.id.hand_up_checkBox); //获取用户设置 mSharedPreferences = getSharedPreferences("myshare",MODE_PRIVATE); mEditor = mSharedPreferences.edit(); //根据设置更新界面 handon = mSharedPreferences.getBoolean("On", false); if(handon) handOnCheckBox.setChecked(true); else handOnCheckBox.setChecked(false); handup = mSharedPreferences.getBoolean("Up", false); if(handup) handUpCheckBox.setChecked(true); else handUpCheckBox.setChecked(false); //用户启动service的动作 mIntent.setAction("com.nan.vibration.TELE_SERVICE"); handOnCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub //用户设置改变时先停止service stopService(mIntent); if(isChecked) handon = true; else handon = false; //保存记录 mEditor.putBoolean("On", handon); mEditor.commit(); //用户设置完再开启service startService(mIntent); //如果两个都没有设置就停止service if((!handup)&&(!handon)) stopService(mIntent); } }); handUpCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub //用户设置改变时先停止service stopService(mIntent); if(isChecked) handup = true; else handup = false; //保存记录 mEditor.putBoolean("Up", handup); mEditor.commit(); //用户设置完再开启service startService(mIntent); //如果两个都没有设置就停止service if((!handon)&&(!handup)) stopService(mIntent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_vibration_main, menu); return true; } }
VibrationService.java文件:
package com.nan.vibration; import android.app.Service; import android.content.Intent; import android.content.IntentFilter; import android.os.IBinder; import android.telephony.TelephonyManager; public class VibrationService extends Service { public final static String PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED; private PhoneReceiver mPhoneReceiver; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { } @Override public int onStartCommand(Intent intent, int flags, int startId) { mPhoneReceiver = new PhoneReceiver(); IntentFilter intentFilter = new IntentFilter(); //添加receiver接收的动作 intentFilter.addAction(PHONE_STATE); intentFilter.setPriority(Integer.MAX_VALUE); //注册receiver registerReceiver(mPhoneReceiver, intentFilter); return START_STICKY; } @Override public void onDestroy() { //注销receiver unregisterReceiver(mPhoneReceiver); } }
PhoneReceiver.java文件
package com.nan.vibration; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Vibrator; import android.telephony.TelephonyManager; public class PhoneReceiver extends BroadcastReceiver { private Vibrator mVibrator = null; private SharedPreferences mSharedPreferences = null; boolean handon; boolean handup; boolean hadRinging = false; @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub TelephonyManager tManager = (TelephonyManager) arg0.getSystemService(Service.TELEPHONY_SERVICE); mVibrator = (Vibrator)arg0.getSystemService(Service.VIBRATOR_SERVICE); mSharedPreferences = arg0.getSharedPreferences("myshare",0); //读取用户设置 handon = mSharedPreferences.getBoolean("On", false); handup = mSharedPreferences.getBoolean("Up", false); switch(tManager.getCallState()) { //挂断 case TelephonyManager.CALL_STATE_IDLE: { if(handup) mVibrator.vibrate(200);//震动200ms hadRinging = false; } break; //接通 case TelephonyManager.CALL_STATE_OFFHOOK: { if(handon&&hadRinging) mVibrator.vibrate(200);//震动200ms } break; //来电响铃 case TelephonyManager.CALL_STATE_RINGING: { hadRinging = true; } break; // default: break; } } }
BootReceiver.java文件
package com.nan.vibration; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootReceiver extends BroadcastReceiver { final Intent mIntent = new Intent(); @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub //开机动作? if(arg1.getAction().equals( Intent.ACTION_BOOT_COMPLETED )) { mIntent.setAction("com.nan.vibration.TELE_SERVICE"); //开启service arg0.startService(mIntent); } } }
最后,AndroidManifest.xml文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.nan.vibration" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".VibrationMainActivity" android:label="@string/title_activity_vibration_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".VibrationService" android:exported="false" > <intent-filter> <action android:name="com.nan.vibration.TELE_SERVICE" /> </intent-filter> </service> <receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> </manifest>
真机运行时:
PS:
本人在原生Android4.1.2的galaxy nexus(三星I9250)上亲测可用。
相关文章推荐
- Android WIFI应用简单开发实例
- Android开发学习笔记--计时器的应用实例
- 【Android应用开发】-(14)JNI----经典实例分析
- Android 开发程序锁应用简单实例
- Android OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程序框架
- Android开发实例-健康食谱应用(二)
- Android应用开发中Fragment的静态加载与动态加载实例
- 标准体重计算器Android应用的开发实例
- Android应用:Service开发实例(二)之Service的两种创建方法和其生命周期
- Android开发实例-高校录取分数线应用(一)
- Android开发应用实例:ListView的应用
- Android OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程序框架
- android 蓝牙锁应用实例开发(一) 简介
- 实例讲解Android应用开发中Fragment生命周期的控制
- [Android实例] Sensor传感器源码的阅读与应用开发简单实例
- Android开发实例-健康食谱应用(一)
- Android 应用开发实例之情景模式
- android 蓝牙锁应用开发实例(三)蓝牙相关功能实现【第一部分】
- Android应用:Service开发实例(一)之AIDL和远程调用
- Android应用:Service开发实例(三)之Service的具体应用方法