在系统设置中添加一个开关选项
将选项添加到系统 “设置–显示” 中,
显示页面的布局位于\Settings\res\xml\display_settings.xml中,在其中添加
<SwitchPreference
android:key="host_switch"
android:title="@string/host_switch"
settings:controller="com.android.settings.display.HostSwitchPreferenceController"/>
controller:控制选项开关的java文件
创建HostSwitchPreferenceController.java
public class HostSwitchPreferenceController extends TogglePreferenceController implements Preference.OnPreferenceChangeListener {
public HostSwitchPreferenceController(Context context, String key) {
super(context, key);
}
@Override
public boolean isChecked() {
return false;
}
@Override
public boolean setChecked(boolean isChecked) {
return true;
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
继承 TogglePreferenceController 类,重写 isChecked(),setChecked(),getAvailabilityStatus()
isChecked(): 控制选项开启或关闭,返回true开启,否则关闭
setChecked(boolean isChecked): 点击开关,状态改变时触发,开启isChecked为true,关闭为false
getAvailabilityStatus(): 该选项是否可用,返回0显示
/**
* The setting is available, and searchable to all search clients.
*/
public static final int AVAILABLE = 0;
控制Host模式切换
// USB 模式节点,确保设备已存在该节点,否则需要底层提供,改为自己设备对应节点路径
private static final String SYS_MODE = "/sys/devices/platform/fe8a0000.usb2-phy/otg_mode";
private static final String HOST_MODE = "host";
private static final String OTG_MODE = "otg";
@Override
public boolean isChecked() {
String mode = readFile(SYS_MODE);//读取节点,获取当前模式,这里不知道为什么后面会多一个换行符
boolean isChecked = mode.equals(HOST_MODE+"\n");//判断是否为host模式
if(isChecked){//如果为true选项开关选中
return true;
}
return false;
}
@Override
public boolean setChecked(boolean isChecked) {
writeFile(SYS_MODE,isChecked ? HOST_MODE : OTG_MODE);//开关改变,写入节点切换模式
return true;
}
读写节点的方法
private void writeFile(String path, String content) {
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(path);
if (fileWriter != null) {
fileWriter.write(content);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileWriter != null)
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private String readFile(String fileName){
StringBuilder sb = new StringBuilder("");
try{
File file = new File(fileName);
FileInputStream inputStream = new FileInputStream(file);
byte[] buffer =new byte[1024];
int len = inputStream.read(buffer);
while (len>0){
sb.append(new String(buffer,0,len));
len = inputStream.read(buffer);
}
inputStream.close();
}catch (Exception ex){
ex.printStackTrace();
}
return sb.toString();
}