首先我们先定义好中文和英文的字符串资源
路径:vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml
<string name="accessibility_otg_switch_title">"OTG Switch"</string>
路径:vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml
<string name="accessibility_otg_switch_title" msgid="8480105032417444275">"OTG 开关"</string>
在设置-无障碍的菜单中增加我们定义的SwitchPreference
路径:vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/accessibility_settings.xml
<SwitchPreference
android:key="toggle_otg_preference"
android:title="@string/accessibility_otg_switch_title"
android:persistent="false"/>
接着我们找到无障碍xml所对应的Java文件
路径:vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/accessibility/AccessibilitySettings.java
需要导入的包
import android.support.v14.preference.SwitchPreference;
import android.util.Log;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
private static final String TOGGLE_OTG_PREFERENCE =
"toggle_otg_preference"; //定义key
private SwitchPreference mOtgPreference; //声明控件
//在 initializeAllPreferences 方法中绑定控件 并设置默认状态 设置监听
private void initializeAllPreferences() {
//绑定控件 默认关闭 设置监听 此方法中 private void initializeAllPreferences()
mOtgPreference = (SwitchPreference) findPreference(TOGGLE_OTG_PREFERENCE);
mOtgPreference.setChecked(false);
mOtgPreference.setOnPreferenceChangeListener(this);
}
//在重写的 onPreferenceChange 监听刚才的控件
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//...以上省略
//设置监听内容 onPreferenceChange
else if (mOtgPreference == preference) {
Log.d("soda water",String.valueOf((Boolean)newValue));
controlBrightness((Boolean)newValue);
return true;
}
}
//FileWriter中的字符串就是节点的具体路径可根据项目而定
//建立字节流向节点写入数据
private void controlBrightness(Boolean commod) {
BufferedWriter bufWriter;
try {
bufWriter = new BufferedWriter(new FileWriter("sys/switch_mode/otg_en_switch"));
bufWriter.write(commod?"1":"0");
bufWriter.close();
} catch (IOException e) {
Log.e("soda water", " ***controlRedBrightness ERROR*** Here is what I know:" + e.getMessage());
e.printStackTrace();
}
}
写完上面这些我们目前还不能对节点进行控制因为Android有selinux的原因 我们需要加上对应节点所需的权限
定义类型
路径:device/xxx/common/sepolicy/non_plat/file.te
type freeme_custom_otg, file_type, data_file_type, core_data_file_type, mlstrustedobject;
绑定节点
路径:device/xxx/common/sepolicy/non_plat/file_contexts
#otg switch
sys/switch_mode/otg_en_switch u:object_r:freeme_custom_otg:s0
查看avc报什么权限以及类型 adb shell -> su -> logcat | grep avc
路径:device/xxx/common/sepolicy/non_plat/system_app.te
allow system_app freeme_custom_otg:file { read write open ioctl getattr setattr };
给节点权限 读写执行
路径:device/xxx/em50lgo81_custom_e25/init.project.rc
chmod 777 /sys/switch_mode/otg_en_switch