您的位置:首页 > 移动开发 > Android开发

android L平台增加来电翻转静音菜单、功能

2017-05-11 19:23 477 查看
-git a/device/xxx/system.prop b/device/xxx/system.prop

index d93eeec..df31144 100755

--- a/device/xxx/system.prop

+++ b/device/xxx/system.prop

@@ -66,10 +66,12 @@ ro.kernel.zio=38,108,105,16

debug.hwui.render_dirty_regions=false

ro.sf.lcd_density=240

+ro.support.flipmute=true

diff --git a/frameworks/base/api/current.txt b/frameworks/base/api/current.txt

index 144f292..2c4ea43 100644

--- a/frameworks/base/api/current.txt

+++ b/frameworks/base/api/current.txt

@@ -14123,6 +14123,8 @@ package android.media {

field public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 8; // 0x8

field public static final int FLAG_SHOW_UI = 1; // 0x1

field public static final int FLAG_VIBRATE = 16; // 0x10

+ field public static final int FLIPMUTE_SETTING_OFF = 0; // 0x0

+ field public static final int FLIPMUTE_SETTING_ON = 1; // 0x1

field public static final int FX_FOCUS_NAVIGATION_DOWN = 2; // 0x2

field public static final int FX_FOCUS_NAVIGATION_LEFT = 3; // 0x3

field public static final int FX_FOCUS_NAVIGATION_RIGHT = 4; // 0x4

@@ -25439,6 +25441,7 @@ package android.provider {

field public static final deprecated java.lang.String DIM_SCREEN = "dim_screen";

field public static final java.lang.String DTMF_TONE_WHEN_DIALING = "dtmf_tone";

field public static final java.lang.String END_BUTTON_BEHAVIOR = "end_button_behavior";

+ field public static final java.lang.String FLIPMUTE_WHEN_RINGING = "flipmute_when_ringing";

field public static final java.lang.String FONT_SCALE = "font_scale";

field public static final java.lang.String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";

field public static final deprecated java.lang.String HTTP_PROXY = "http_proxy";

diff --git a/frameworks/base/api/system-current.txt b/frameworks/base/api/system-current.txt

index ca783e1..174e758 100644

--- a/frameworks/base/api/system-current.txt

+++ b/frameworks/base/api/system-current.txt

@@ -15146,6 +15146,8 @@ package android.media {

field public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 8; // 0x8

field public static final int FLAG_SHOW_UI = 1; // 0x1

field public static final int FLAG_VIBRATE = 16; // 0x10

+ field public static final int FLIPMUTE_SETTING_OFF = 0; // 0x0

+ field public static final int FLIPMUTE_SETTING_ON = 1; // 0x1

field public static final int FX_FOCUS_NAVIGATION_DOWN = 2; // 0x2

field public static final int FX_FOCUS_NAVIGATION_LEFT = 3; // 0x3

field public static final int FX_FOCUS_NAVIGATION_RIGHT = 4; // 0x4

@@ -27031,6 +27033,7 @@ package android.provider {

field public static final deprecated java.lang.String DIM_SCREEN = "dim_screen";

field public static final java.lang.String DTMF_TONE_WHEN_DIALING = "dtmf_tone";

field public static final java.lang.String END_BUTTON_BEHAVIOR = "end_button_behavior";

+ field public static final java.lang.String FLIPMUTE_WHEN_RINGING = "flipmute_when_ringing";

field public static final java.lang.String FONT_SCALE = "font_scale";

field public static final java.lang.String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";

field public static final deprecated java.lang.String HTTP_PROXY = "http_proxy";

diff --git a/frameworks/base/core/java/android/provider/Settings.java b/frameworks/base/core/java/android/provider/Settings.java

index f97d9e8..576c1f4 100644

--- a/frameworks/base/core/java/android/provider/Settings.java

+++ b/frameworks/base/core/java/android/provider/Settings.java

@@ -2414,6 +2414,15 @@ public final class Settings {

*/

public static final String VIBRATE_WHEN_RINGING = "vibrate_when_ringing";

+

+ //jimbo add start

+ /**

+ * Flip mute setting when incall ringing

+ *

+ */

+ public static final String FLIPMUTE_WHEN_RINGING = "flipmute_when_ringing";

+ //jimbo add end

+

/**

* Whether the audible DTMF tones are played by the dialer when dialing. The value is

* boolean (1 or 0).

@@ -2739,6 +2748,7 @@ public final class Settings {

SIP_RECEIVE_CALLS,

POINTER_SPEED,

VIBRATE_WHEN_RINGING,

+ FLIPMUTE_WHEN_RINGING, //jimbo add

RINGTONE,

LOCK_TO_APP_ENABLED,

NOTIFICATION_SOUND,

diff --git a/frameworks/base/media/java/android/media/AudioManager.java b/frameworks/base/media/java/android/media/AudioManager.java

index dff5d51..ae1b607 100644

--- a/frameworks/base/media/java/android/media/AudioManager.java

+++ b/frameworks/base/media/java/android/media/AudioManager.java

@@ -631,6 +631,15 @@ public class AudioManager {

*/

public static final int VIBRATE_SETTING_ON = 1;

+ //jimbo add start

+ /**

+ * Flip mute setting when incall ringing

+ *

+ */

+ public static final int FLIPMUTE_SETTING_OFF = 0;

+ public static final int FLIPMUTE_SETTING_ON = 1;

+ //jimbo add end

+

/**

* Vibrate setting that suggests to only vibrate when in the vibrate ringer

* mode.

diff --git a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

index c9e1e42..4073e22 100644

--- a/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

+++ b/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

@@ -1107,6 +1107,11 @@ public class DatabaseHelper extends SQLiteOpenHelper {

if (upgradeVersion == 77) {

// Introduce "vibrate when ringing" setting

loadVibrateWhenRingingSetting(db);

+ //jimbo add for flip_mute start

+ if (SystemProperties.getBoolean("ro.support.flipmute", false)) {

+ loadFlipMuteWhenRingingSetting(db);

+ }

+ //jimbo add end

upgradeVersion = 78;

}

@@ -2259,6 +2264,12 @@ public class DatabaseHelper extends SQLiteOpenHelper {

}

loadVibrateWhenRingingSetting(db);

+

+ //jimbo add for flip_mute start

+ if (SystemProperties.getBoolean("ro.support.flipmute", false)) {

+ loadFlipMuteWhenRingingSetting(db);

+ }

+ //jimbo add end

}

private void loadVibrateSetting(SQLiteDatabase db, boolean deleteOld) {

@@ -2303,6 +2314,21 @@ public class DatabaseHelper extends SQLiteOpenHelper {

if (stmt != null) stmt.close();

}

}

+

+ //jimbo add for flip_mute start

+ private void loadFlipMuteWhenRingingSetting(SQLiteDatabase db) {

+ int flipMuteWhenRinging = getIntValueFromSystem(db, Settings.System.FLIPMUTE_WHEN_RINGING, AudioManager.FLIPMUTE_SETTING_ON);

+

+ SQLiteStatement stmt = null;

+ try {

+ stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"

+ + " VALUES(?,?);");

+ loadSetting(stmt, Settings.System.FLIPMUTE_WHEN_RINGING, flipMuteWhenRinging);

+ } finally {

+ if (stmt != null) stmt.close();

+ }

+ }

+//jimbo add end

private void loadSettings(SQLiteDatabase db) {

diff --git a/packages/apps/Dialer/AndroidManifest.xml b/packages/apps/Dialer/AndroidManifest.xml

index 8f15d4c..9d1f9e3 100644

--- a/packages/apps/Dialer/AndroidManifest.xml

+++ b/packages/apps/Dialer/AndroidManifest.xml

@@ -288,6 +288,9 @@

android:exported="false"

android:screenOrientation="nosensor" >

</activity>

+

+ <service android:name="com.android.incallui.SensorFunctionServiceIncall"

+ android:exported="false" />

<activity android:name="com.android.incallui.CircularRevealActivity"

android:theme="@style/Theme.CircularRevealAnimation"

@@ -376,5 +379,6 @@

<action android:name="com.android.incallui.ACTION_UPDATE_UI_FORCED" />

</intent-filter>

</receiver>

+

</application>

</manifest>

diff --git a/packages/apps/Dialer/persistent/AndroidManifest.xml b/packages/apps/Dialer/persistent/AndroidManifest.xml

index 4d2416f..37eca6b 100644

--- a/packages/apps/Dialer/persistent/AndroidManifest.xml

+++ b/packages/apps/Dialer/persistent/AndroidManifest.xml

@@ -289,6 +289,8 @@

android:exported="false"

android:screenOrientation="nosensor" >

</activity>

+ <service android:name="com.android.incallui.SensorFunctionServiceIncall"

+ android:exported="false" />

<activity android:name="com.android.incallui.CircularRevealActivity"

android:theme="@style/Theme.CircularRevealAnimation"

diff --git a/packages/apps/Dialer/res/values-zh-rCN/strings.xml b/packages/apps/Dialer/res/values-zh-rCN/strings.xml

index da7d666..d6d58d0 100644

--- a/packages/apps/Dialer/res/values-zh-rCN/strings.xml

+++ b/packages/apps/Dialer/res/values-zh-rCN/strings.xml

@@ -183,6 +183,7 @@

<string name="sounds_and_vibrate_category_title" msgid="7589787045192519254">"提示音和振动"</string>

<string name="ringtone_title" msgid="760362035635084653">"手机铃声"</string>

<string name="vibrate_on_ring_title" msgid="3362916460327555241">"有来电时响铃并振动"</string>

+ <string name="flipmute_on_ring_title" >"有来电时翻转静音"</string>

<string name="dtmf_tone_enable_title" msgid="6571449695997521615">"拨号键盘提示音"</string>

<string name="other_settings_title" msgid="7976283601445863248">"其他"</string>

<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"快速回复"</string>

diff --git a/packages/apps/Dialer/res/values/strings.xml b/packages/apps/Dialer/res/values/strings.xml

index f6da415..14d7389 100644

--- a/packages/apps/Dialer/res/values/strings.xml

+++ b/packages/apps/Dialer/res/values/strings.xml

@@ -707,6 +707,7 @@

<!-- Setting option name to enable or disable vibration when ringing the phone.

[CHAR LIMIT=30] -->

<string name="vibrate_on_ring_title">"Also vibrate for calls</string>

+ <string name="flipmute_on_ring_title">"Also flipmute for calls</string>

<!-- Setting option name to enable or disable DTMF tone sound [CHAR LIMIT=30] -->

<string name="dtmf_tone_enable_title">Dialpad tones</string>

diff --git a/packages/apps/Dialer/res/xml/general_settings.xml b/packages/apps/Dialer/res/xml/general_settings.xml

index b1a78c1..38cc1c9 100644

--- a/packages/apps/Dialer/res/xml/general_settings.xml

+++ b/packages/apps/Dialer/res/xml/general_settings.xml

@@ -58,6 +58,12 @@

android:title="@string/vibrate_on_ring_title"

android:persistent="false"

android:defaultValue="false" />

+

+ <!-- Also flipmute for calls -->

+ <CheckBoxPreference

+ android:key="button_flipmute_on_ringing"

+ android:title="@string/flipmute_on_ring_title"

+ android:persistent="false" />

</PreferenceCategory>

@@ -80,4 +86,4 @@

</PreferenceCategory>

-</PreferenceScreen>

\ No newline at end of file

+</PreferenceScreen>

diff --git a/packages/apps/Dialer/src/com/android/dialer/settings/GeneralSettingsFragment.java b/packages/apps/Dialer/src/com/android/dialer/settings/GeneralSettingsFragment.java

index d8354ef..979af68 100644

--- a/packages/apps/Dialer/src/com/android/dialer/settings/GeneralSettingsFragment.java

+++ b/packages/apps/Dialer/src/com/android/dialer/settings/GeneralSettingsFragment.java

@@ -67,6 +67,9 @@ public class GeneralSettingsFragment extends PreferenceFragment

private CheckBoxPreference mVibrateWhenRinging;

private CheckBoxPreference mPlayDtmfTone;

private Preference mRespondViaSms;

+

+ private static final String BUTTON_FLIPMUTE_ON_RING = "button_flipmute_on_ringing";//jimbo add

+ private CheckBoxPreference mFlipMuteWhenRinging;//jimbo add

private Runnable mRingtoneLookupRunnable;

private final Handler mRingtoneLookupComplete = new Handler() {

@@ -138,6 +141,25 @@ public class GeneralSettingsFragment extends PreferenceFragment

}

}

+//jimbo add start for flipmute

+ mFlipMuteWhenRinging = (CheckBoxPreference) findPreference(BUTTON_FLIPMUTE_ON_RING);

+ if (mFlipMuteWhenRinging != null) {

+ if (android.os.SystemProperties.getBoolean("ro.support.flipmute", false)) {

+ boolean bFlipMuteEnabled = Settings.System.getInt(getActivity().getContentResolver(), Settings.System.FLIPMUTE_WHEN_RINGING, 0) != 0;

+ if (bFlipMuteEnabled != mFlipMuteWhenRinging.isChecked()) {

+ mFlipMuteWhenRinging.setChecked(bFlipMuteEnabled);

+ }

+

+ // click event

+ mFlipMuteWhenRinging.setOnPreferenceChangeListener(this);

+ } else {

+ // hide

+ soundCategory.removePreference(mFlipMuteWhenRinging);

+ mFlipMuteWhenRinging = null;

+ }

+ }

+//jimbo add end

+

if (mPlayDtmfTone != null) {

mPlayDtmfTone.setOnPreferenceChangeListener(this);

/// M: [ALPS01841736] add listener for DMTF change

@@ -175,6 +197,12 @@ public class GeneralSettingsFragment extends PreferenceFragment

/// M: [ALPS01791893] phone not vibrate, when the MT call

setVibrateOnRing(doVibrate);

}

+ //jimbo add start for flipmute

+ else if(preference == mFlipMuteWhenRinging){

+ boolean enable = (Boolean) objValue;

+ Settings.System.putInt(mContext.getContentResolver(), Settings.System.FLIPMUTE_WHEN_RINGING, enable ? 1 : 0);

+ }

+ //jimbo add end

return true;

}

diff --git a/packages/apps/InCallUI/src/com/android/incallui/InCallActivity.java b/packages/apps/InCallUI/src/com/android/incallui/InCallActivity.java

index 3087b3c..a947462 100644

--- a/packages/apps/InCallUI/src/com/android/incallui/InCallActivity.java

+++ b/packages/apps/InCallUI/src/com/android/incallui/InCallActivity.java

@@ -52,6 +52,10 @@ import android.view.Window;

import android.view.WindowManager;

import android.view.accessibility.AccessibilityEvent;

+//jimbo add for flip_mute start

+import android.provider.Settings;

+//jimbo add end

+

import com.android.ims.ImsManager;

import com.android.phone.common.animation.AnimUtils;

import com.android.phone.common.animation.AnimationListenerAdapter;

@@ -251,7 +255,7 @@ public class InCallActivity extends Activity {

}

super.onSaveInstanceState(out);

}

-

+

@Override

protected void onStart() {

Log.d(this, "onStart()...");

@@ -259,6 +263,19 @@ public class InCallActivity extends Activity {

// setting activity should be last thing in setup process

InCallPresenter.getInstance().setActivity(this);

+

+//jimbo add for flip_mute start

+ if (android.os.SystemProperties.getBoolean("ro.support.flipmute", false)) {

+ final boolean bFlipMuteEnabled = Settings.System.getInt(getContentResolver(), Settings.System.FLIPMUTE_WHEN_RINGING, 0) != 0;

+

+ if (bFlipMuteEnabled) {

+ final Intent intent = new Intent(this, SensorFunctionServiceIncall.class);

+ //intent.setAction("com.android.incallui.SensorFunctionServiceIncall");

+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

+ this.startService(intent);

+ }

+ }

+//jimbo add end

}

@Override

@@ -351,6 +368,19 @@ public class InCallActivity extends Activity {

mAnimateDialpadOnShow = false;

mDtmfText = null;

/// @}

+

+//jimbo add for flip_mute start

+ if (android.os.SystemProperties.getBoolean("ro.support.flipmute", false)) {

+ final boolean bFlipMuteEnabled = Settings.System.getInt(getContentResolver(), Settings.System.FLIPMUTE_WHEN_RINGING, 0) != 0;

+

+ if (bFlipMuteEnabled) {

+ final Intent intent = new Intent(this, SensorFunctionServiceIncall.class);

+ //intent.setAction("com.android.incallui.SensorFunctionServiceIncall");

+ this.stopService(intent);

+ }

+ }

+//jimbo add end

+

super.onStop();

}

diff --git a/packages/apps/InCallUI/src/com/android/incallui/SensorFunctionServiceIncall.java b/packages/apps/InCallUI/src/com/android/incallui/SensorFunctionServiceIncall.java

new file mode 100644

index 0000000..21e4e13

--- /dev/null

+++ b/packages/apps/InCallUI/src/com/android/incallui/SensorFunctionServiceIncall.java

@@ -0,0 +1,118 @@

+/*

+ * Copyright (C) 2013 The Android Open Source Project

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ * http://www.apache.org/licenses/LICENSE-2.0
+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License

+ */

+

+package com.android.incallui;

+

+

+import android.app.Service;

+import android.content.Context;

+import android.content.Intent;

+import android.hardware.Sensor;

+import android.hardware.SensorEvent;

+import android.hardware.SensorEventListener;

+import android.hardware.SensorManager;

+import android.os.IBinder;

+import android.os.PowerManager;

+import android.media.AudioManager;

+import android.util.Log;

+import android.content.BroadcastReceiver;

+

+public class SensorFunctionServiceIncall extends Service {

+

+ private static final String LOG_TAG = "InCallActivity/SensorFunctionServiceIncall";

+ private static final float CRITICAL_DOWN_ANGLE = -5.0f;

+ private static final float CRITICAL_UP_ANGLE = 5.0f;

+ private static final int Z_ORATIATION = 2;

+

+ private SensorManager mSensorManager;

+ private Sensor mGsensor;

+ private SensorEventListener mGsensorListener;

+ private int mReverseDownFlg = -1;

+ private int previousMuteMode = -1;

+

+

+

+ private boolean mActFlag = false;

+

+ @Override

+ public void onCreate() {

+ super.onCreate();

+

+ mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

+ mGsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);// TYPE_GRAVITY);

+

+ Log.d(LOG_TAG, "onCreate()... this = " + this);

+

+ mGsensorListener = new SensorEventListener() {

+

+ @Override

+ public void onAccuracyChanged(Sensor sensor, int accuracy) {

+ }

+

+ @Override

+ public void onSensorChanged(SensorEvent event) {

+ //Log.d(LOG_TAG,"onSensorChanged()... event.values[SensorManager.DATA_Z] = " + event.values[SensorManager.DATA_Z]);

+

+ if (event.values[SensorManager.DATA_Z] >= CRITICAL_UP_ANGLE) { // screen up first

+ mReverseDownFlg = 0;

+ } else if (event.values[SensorManager.DATA_Z] <= CRITICAL_DOWN_ANGLE

+ && mReverseDownFlg == 0) { // screen down next

+ mReverseDownFlg = 1;

+ }

+ //Log.d(LOG_TAG,"onSensorChanged().............. mReverseDownFlg = " + mReverseDownFlg+" previousMuteMode="+previousMuteMode);

+

+ if (mReverseDownFlg == 1) { // screen reverse from up to down

+ AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

+ if (previousMuteMode == -1 && am != null) {

+ previousMuteMode = am.getRingerMode();

+ am.setRingerMode(AudioManager.RINGER_MODE_SILENT);

+

+ Log.d(LOG_TAG,"onSensorChanged().............. set mute----------------- ");

+ }

+ /*else{

+ am.setRingerMode(previousMuteMode);

+ previousMuteMode = -1;

+ }*/

+ }

+ }

+ };

+

+ if(mGsensorListener != null && mGsensor != null){

+ mSensorManager.registerListener(mGsensorListener, mGsensor, SensorManager.SENSOR_DELAY_GAME);

+ }

+ }

+

+ @Override

+ public IBinder onBind(Intent arg0) {

+ return null;

+ }

+

+ @Override

+ public void onDestroy() {

+ AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

+ if (previousMuteMode != -1 && am != null) {

+ am.setRingerMode(previousMuteMode);

+ previousMuteMode = -1;

+

+ Log.d(LOG_TAG,"onDestroy().............. set noraml----------------- ");

+ }

+

+ if(mGsensorListener != null && mGsensor != null){

+ mSensorManager.unregisterListener(mGsensorListener, mGsensor);

+ }

+ }

+

+}



以下是其他方法:
转自:http://www.android100.org/html/201409/10/64057.html

在CallNotifier.Java中 加入如下代码:

public void flipMute(Context contextg) {

sm = (SensorManager)getSystemService(Service.SENSOR_SERVICE);

sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

mySensorListener = new SensorEventListener() {

@Override

public void onSensorChanged(SensorEvent event) {

x = event.values[0];

y = event.values[1];

z = event.values[2];

if (x < 1 && x > -1 && y < 1 && y > -1) {

if (z > 0) {

mGoUp = true;

} else {

mGoUp = false;

}

} else {

// if (x > 1 || x < -1 || y > 1 || y < -1 ) {

if ( z > 0 && !mGoUp ) {

mRinger.stopRing();

if(mySensorListener != null){

sm.unregisterListener(mySensorListener); //Add by kylin 2013.07.25

}

}

if ( z < 0 && mGoUp ) {

mRinger.stopRing();

if(mySensorListener != null){

sm.unregisterListener(mySensorListener); //Add by kylin 2013.07.25

}

}

// }

}

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

};

sm.registerListener(mySensorListener, sensor,

SensorManager.SENSOR_DELAY_GAME);

}

再在相应位置调用如上方法即可以实现此功能。

Android 重力感应监听:

public class ShakeListener implements SensorEventListener {

public static ShakeListener sensor1;

// 速度阈值,当摇晃速度达到这值后产生作用

private static final int SPEED_SHRESHOLD = 400;

// 两次检测的时间间隔

private static final int UPTATE_INTERVAL_TIME = 70;

// 传感器管理器

private SensorManager sensorManager;

// 传感器

private Sensor sensor;

// 重力感应监听器

private OnShakeListener onShakeListener;

// 上下文

private static Context context;

// 手机上一个位置时重力感应坐标

private float lastX;

private float lastY;

private float lastZ;

// 上次检测时间

private long lastUpdateTime;

public static ShakeListener newInstance(Context c) {

if (sensor1 == null) {

sensor1 = new ShakeListener();

context = c;

return sensor1;

} else {

return sensor1;

}

}

// 开始

public void start() {

// 获得传感器管理器

if(sensorManager==null){

sensorManager = (SensorManager) context

.getSystemService(Context.SENSOR_SERVICE);

}

if (sensorManager != null&&sensor==null) {

// 获得重力传感器

sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

}

if (sensor != null) {

sensorManager.registerListener(this, sensor,

SensorManager.SENSOR_DELAY_NORMAL);

}

}

// 停止检测

public void stop() {

sensorManager.unregisterListener(this);

}

// 摇晃监听接口

public interface OnShakeListener {

public void onShake();

}

// 设置重力感应监听器

public void setOnShakeListener(OnShakeListener listener) {

onShakeListener = listener;

}

// 重力感应器感应获得变化数据

@Override

public void onSensorChanged(SensorEvent event) {

long currentUpdateTime = System.currentTimeMillis();

// 两次检测的时间间隔

long timeInterval = currentUpdateTime - lastUpdateTime;

// 判断是否达到了检测时间间隔

if (timeInterval < UPTATE_INTERVAL_TIME) {

return;

}

// 现在的时间变成last时间

lastUpdateTime = currentUpdateTime;

// 获得x,y,z坐标

float x = event.values[0];

float y = event.values[1];

float z = event.values[2];

// 获得x,y,z的变化值

float deltaX = x - lastX;

float deltaY = y - lastY;

float deltaZ = z - lastZ;

// 将现在的坐标变成last坐标

lastX = x;

lastY = y;

lastZ = z;

double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ

* deltaZ)

/ timeInterval * 10000;

// 达到速度阀值,发出提示

if (speed >= SPEED_SHRESHOLD){

// 手机晃动

onShakeListener.onShake();

}

}

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

}

原理:监听phone状态,来电时启动一个服务监听Gsensor 当检测到手机从向上翻转到向下(Z值5以上翻到到-5以下),设置ringtone音量为0 来电接通或挂断后恢复ringtone音量
注册phone状态监听器:本文选自com.android.systemui.statusbar.phone.PhoneStatusBar onStart函数最后

[java] view
plain copy







</pre><p></p><p></p><pre code_snippet_id="1619352" snippet_file_name="blog_20160322_4_9263662" name="code" class="java">public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener {

public void start() {

......

//jimbo add for flip_mute start

if (android.os.SystemProperties.getBoolean("ro.flipmute.support", false)) {

Xlog.d("jimbo", "PhoneStatusBar-- start--- ");

TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);

telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

}

//jimbo add end

}

//jimbo add for flip_mute start

private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {

@Override

public void onCallStateChanged(int state, String incomingNumber) {

final Intent intent = new Intent(mContext, SensorFunctionServiceIncall.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

boolean bFlipMuteEnabled = Settings.System.getInt(mContext.getContentResolver(), Settings.System.FLIPMUTE_WHEN_RINGING, 0) != 0;

//Xlog.d("jimbo", "PhoneStateListener, new state=" + state+" bFlipMuteEnabled="+bFlipMuteEnabled);

switch (state) {

case TelephonyManager.CALL_STATE_IDLE:

//Xlog.d("jimbo", "PhoneStateListener---idle");

mContext.stopService(intent);

break;

case TelephonyManager.CALL_STATE_RINGING:

//Xlog.d("jimbo", "PhoneStateListener---incoming " + incomingNumber);

if (bFlipMuteEnabled) {

mContext.startService(intent);

}

break;

case TelephonyManager.CALL_STATE_OFFHOOK:

// Xlog.d("jimbo", "PhoneStateListener---in calling");

mContext.stopService(intent);

default:

break;

}

super.onCallStateChanged(state, incomingNumber);

}

};

//jimbo add end

sensor服务内容:

[java] view
plain copy







package com.android.systemui.statusbar.phone;

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.os.IBinder;

import android.os.PowerManager;

import android.media.AudioManager;

import android.util.Log;

import android.content.BroadcastReceiver;

public class SensorFunctionServiceIncall extends Service {

private static final String LOG_TAG = "SensorFunctionServiceIncall";

private static final float CRITICAL_DOWN_ANGLE = -5.0f;

private static final float CRITICAL_UP_ANGLE = 5.0f;

private static final int Z_ORATIATION = 2;

private AudioManager mAudioManager;

private SensorManager mSensorManager;

private Sensor mGsensor;

private SensorEventListener mGsensorListener;

private int mReverseDownFlg = -1;

private int previousMuteMode = -1;

private boolean mActFlag = false;

@Override

public void onCreate() {

super.onCreate();

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

mGsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);// TYPE_GRAVITY);

mAudioManager= (AudioManager) getSystemService(Context.AUDIO_SERVICE);

Log.d(LOG_TAG, "onCreate()... this = " + this);

mGsensorListener = new SensorEventListener() {

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

@Override

public void onSensorChanged(SensorEvent event) {

//Log.d(LOG_TAG,"onSensorChanged()... event.values[SensorManager.DATA_Z] = " + event.values[SensorManager.DATA_Z]);

if (event.values[SensorManager.DATA_Z] >= CRITICAL_UP_ANGLE) { // screen up first

mReverseDownFlg = 0;

} else if (event.values[SensorManager.DATA_Z] <= CRITICAL_DOWN_ANGLE

&& mReverseDownFlg == 0) { // screen down next

mReverseDownFlg = 1;

}

//Log.d(LOG_TAG,"onSensorChanged().............. mReverseDownFlg = " + mReverseDownFlg+" previousMuteMode="+previousMuteMode);

if (mReverseDownFlg == 1) { // screen reverse from up to down

if (previousMuteMode == -1 && mAudioManager != null) {

//previousMuteMode = mAudioManager.getRingerMode();

//mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

previousMuteMode = mAudioManager.getStreamVolume(AudioManager.STREAM_RING);

mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0);

Log.d(LOG_TAG,"onSensorChanged().........mute..... previousMuteMode="+previousMuteMode);

}

}

}

};

if(mGsensorListener != null && mGsensor != null){

mSensorManager.registerListener(mGsensorListener, mGsensor, SensorManager.SENSOR_DELAY_GAME);

}

}

@Override

public IBinder onBind(Intent arg0) {

return null;

}

@Override

public void onDestroy() {

if (previousMuteMode != -1 && mAudioManager != null) {

//mAudioManager.setRingerMode(previousMuteMode);

mAudioManager.setStreamVolume(AudioManager.STREAM_RING, previousMuteMode, 0);

previousMuteMode = -1;

Log.d(LOG_TAG,"onDestroy().............. set noraml----------------- ");

}

if(mGsensorListener != null && mGsensor != null){

mSensorManager.unregisterListener(mGsensorListener, mGsensor);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: