settings里添加两指调节音量item及功能

来源:互联网 发布:惠州网络问政阳光清单 编辑:程序博客网 时间:2024/06/07 07:51

记录开发一个手势体感功能—两指调节音量
触摸屏的功能肯定会用到PhoneWindow.java,在frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java下面(基于Android6.0),

//add  (start)import android.content.Intent;import android.content.ContentResolver;import android.provider.Settings;import android.app.Instrumentation;import java.text.DecimalFormat;//add  (end)public class PhoneWindow extends Window implements MenuBuilder.Callback {private final static String TAG = "PhoneWindow";//add  (start)    private Context mContext;    private int pointy1 = 0;    private int pointy2 = 0;    private int mpointy1 = 0;    private int mpointy2 = 0;    private boolean is_move = false;    private boolean isSendKeyCodeThreadStart = false;//add  (end) public PhoneWindow(Context context) {        super(context);        //add  (start)        mContext = context;        //add (end)        mLayoutInflater = LayoutInflater.from(context);    }//add (start)        private boolean setStreamVolume(MotionEvent ev){            if(ev.getAction()== MotionEvent.ACTION_POINTER_2_DOWN){                pointy1= (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);                pointy2= (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);            }else if(ev.getAction()== MotionEvent.ACTION_MOVE){                try {                    mpointy1 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);                    mpointy2 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);                }catch (IllegalArgumentException i) {                      //do nothing                }                if((mpointy1 > pointy1) && (mpointy2 > pointy2)){                    try {                        pointy1 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);                        pointy2 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);                    }catch (IllegalArgumentException i) {                      //do nothing                    }                    if(!isSendKeyCodeThreadStart){                        sendKeyCode(KeyEvent.KEYCODE_VOLUME_DOWN);                        //sendKeyCode((float)mpointy1);                    }                    is_move = true;                    Log.e("pp","===========111============");                }else if((mpointy1 < pointy1) && (mpointy2 < pointy2)){                    try {                        pointy1 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 0);                        pointy2 = (int) ev.getAxisValue(MotionEvent.AXIS_Y, 1);                    }catch (IllegalArgumentException i) {                      //do nothing                    }                    if(!isSendKeyCodeThreadStart){                        sendKeyCode(KeyEvent.KEYCODE_VOLUME_UP);                        //sendKeyCode((float)mpointy1);                    }                    is_move = true;                    Log.e("pp","===========222============");                }            }else if(ev.getAction() == MotionEvent.ACTION_UP                    || ev.getAction() == MotionEvent.ACTION_POINTER_2_UP){                isSendKeyCodeThreadStart = false;                return false;            }            return false;        }        private void sendKeyCode(final int keyCode){            new Thread() {                @Override                public void run() {                    isSendKeyCodeThreadStart = true;                    Instrumentation instrumentation = new Instrumentation();                    while (isSendKeyCodeThreadStart) {                        if(is_move){                            try {                                instrumentation.sendKeyDownUpSync(keyCode);                                Log.e("pp","===========keyCode============"+keyCode);                            } catch (Exception e) {                                e.printStackTrace();                                Log.e("pp","========Exception======");                            }                            is_move = false;                        }                        Log.e("pp","===========OOO============");                    }                }            }.start();        }    //add (end)@Override public boolean dispatchTouchEvent(MotionEvent ev) {    final Callback cb = getCallback();    if (DBG_MOTION) {    Log.d(TAG, "dispatchTouchEvent = " + ev + ", cb = " + cb + ", destroyed? = "                        + isDestroyed() + ", mFeatureId = " + mFeatureId);    }    ContentResolver resolver = mContext.getContentResolver();    //add (start)    if (Settings.System.getInt(resolver, "Two_fingers_Switch_themes", 0) == 1){    setStreamVolume(ev);     }    //add(end)   return cb != null && !isDestroyed() && mFeatureId < 0 ? cb.dispatchTouchEvent(ev)                    : super.dispatchTouchEvent(ev);        }

然后在settings里面在加一个界面(针对Android6.0)代码,如下:

package com.android.settings;import android.content.ContentResolver;import android.content.res.Configuration;import android.os.Bundle;import android.os.SystemProperties;import android.preference.Preference;import android.preference.Preference.OnPreferenceClickListener;import android.preference.PreferenceFragment;import android.provider.Settings;import android.preference.PreferenceScreen;import android.preference.SwitchPreference;import android.util.Log;public class FingerGestureSettings extends PreferenceFragment        implements Preference.OnPreferenceChangeListener, OnPreferenceClickListener {    private static final String TAG = "FingerGestureSettings";    private static final String KEY_TWO_FINGER_CHANGEVOLUME = "two_fingers_changevolume";    private SwitchPreference mTwoFingerChangeVolume;    private ContentResolver mResolver = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        addPreferencesFromResource(R.xml.finger_gesture_settings);        mResolver = getActivity().getContentResolver();        mTwoFingerChangeVolume = (SwitchPreference) findPreference(KEY_TWO_FINGER_CHANGEVOLUME);        mTwoFingerChangeVolume.setOnPreferenceClickListener(this);        mTwoFingerChangeVolume.setOnPreferenceChangeListener(this);        mTwoFingerChangeVolume.setPersistent(false);        if (getResources().getBoolean(R.bool.remove_two_finger_changevolume)) {            getPreferenceScreen().removePreference(mTwoFingerChangeVolume);        }        mTwoFingerChangeVolume.setChecked((Settings.System.getInt(mResolver, "Two_fingers_Switch_themes", 0) == 1) ? true : false);        Log.d(TAG, "mTwoFingerChangeVolume=" + Settings.System.getInt(mResolver, "Two_fingers_Switch_themes", 0) + "  ");    }    @Override    public void onConfigurationChanged(Configuration newConfig) {    super.onConfigurationChanged(newConfig);    }    @Override    public void onPause() {        super.onPause();    }    @Override    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {        Log.e(TAG, "onPreferenceTreeClick");        return super.onPreferenceTreeClick(preferenceScreen, preference);    }    public boolean onPreferenceChange(Preference preference, Object objValue) {        final String key = preference.getKey();        Log.e(TAG, "onPreferenceChange,key=" + key);        if (KEY_TWO_FINGER_CHANGEVOLUME.equals(key)) {            boolean checked = mTwoFingerChangeVolume.isChecked();            Log.e(TAG, "checked=" + !checked);            Settings.System.putInt(mResolver, "Two_fingers_Switch_themes", !checked ? 1 : 0);            Log.e(TAG, "two_fingers_changevolume=" + Settings.System.getInt(mResolver, "Two_fingers_Switch_themes", 0));        }         return true;    }    @Override    public boolean onPreferenceClick(Preference preference) {        Log.e(TAG, "onPreferenceClick");        return false;    }}

settings里面还要找到相应的布局文件添加一下布局即可,如:新建一个xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"    android:title="@string/two_finger_changevolume_title" >    <SwitchPreference        android:key="two_fingers_changevolume"        android:summary="@string/accessibility_two_fingers_changevolume_summary"        android:title="@string/accessibility_two_fingers_changevolume_title" /></PreferenceScreen>

如上基本可以在settings里面添加一个功能:两指调节音量

原创粉丝点击