vendor/freeme/frameworks/base/core-export/java/com/freeme/telephony/FreemeSpecialCharSequenceMgr.java
上面是公司自己写的类,真正原生的是在
最好是在原生里写
vendor/mediatek/proprietary/packages/apps/Dialer/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
加入暗码操作
public static boolean handleSecretCode(Context context,String input) {
中加入
if (input.equals("18818")) {
Intent intent = new Intent();
intent.setAction("com.tyd.intent.internet.share.close");
context.sendBroadcast(intent);
android.util.Log.i("yantao","*#18818#");
Toast.makeText(context,context.getString(R.string.internetShare_close),Toast.LENGTH_SHORT).show();
return true;
}
if (input.equals("18819")) {
Intent intent = new Intent();
intent.setAction("com.tyd.intent.internet.share.open");
context.sendBroadcast(intent);
android.util.Log.i("yantao","*#18819#");
Toast.makeText(context,context.getString(R.string.internetShare_open),Toast.LENGTH_SHORT).show();
return true;
}
这里面加了个toast提示用户
字符串加在
vendor/mediatek/proprietary/packages/apps/Dialer/java/com/android/dialer/dialpadview/res/values/strings.xml
vendor/mediatek/proprietary/packages/apps/Dialer/java/com/android/dialer/dialpadview/res/values-zh-rCN/strings.xml
注意!!!这里只能发广播用于信息传输,试过用android.os.SystemProperties.set和Settings.System来存储都没用,数据写不进去。自然读出来的是空或初始值,原因尚未明确。包括说这个广播也只能传给phonewindowmanager接收,传给batterservice无效,可能是需要加入flag才可以
然后在
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
随便找个动态广播接受或者自己写一个
filter.addAction("com.tyd.intent.internet.share.open");
filter.addAction("com.tyd.intent.internet.share.close");
TetheringManager mTetheringManager =(TetheringManager) context.getSystemService(Context.TETHERING_SERVICE);
if(intent.getAction().equals("com.tyd.intent.internet.share.open")) {
BluetoothAdapter btadapter =BluetoothAdapter.getDefaultAdapter();
ConnectivityManager mCm =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
android.os.SystemProperties.set("persist.sys.internet_share","1");
mTetheringManager.setUsbTethering(true);
if (btadapter != null) {
if(!btadapter.isEnabled())btadapter.enable();
mCm.startTethering(TETHERING_BLUETOOTH,true, new ConnectivityManager.OnStartTetheringCallback(){});
mCm.startTethering(TETHERING_ETHERNET,true, new ConnectivityManager.OnStartTetheringCallback(){});
}catch (Exception e){
Log.i("yantao","startTethering error="+e);
}
}
if (intent.getAction().equals("com.tyd.intent.internet.share.close")){
android.os.SystemProperties.set("persist.sys.internet_share","0");
mTetheringManager.stopAllTethering();
}
需要的包
import android.bluetooth.BluetoothAdapter;
import android.net.TetheringManager;
import android.net.ConnectivityManager;
import staticandroid.net.TetheringManager.TETHERING_ETHERNET;
import staticandroid.net.TetheringManager.TETHERING_BLUETOOTH;
关于bluetoothpan的方法就不用了,也可以实现,但没必要
//import android.bluetooth.BluetoothPan;
//import android.bluetooth.BluetoothProfile;
//importjava.util.concurrent.atomic.AtomicReference;
//private AtomicReference<BluetoothPan>mBluetoothPan = new AtomicReference<>();
/*privateBluetoothProfile.ServiceListener mProfileServiceListener =
new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
Log.d(TAG, "onServiceConnected ");
mBluetoothPan.set((BluetoothPan) proxy);
}
public void onServiceDisconnected(intprofile) {
Log.d(TAG, "onServiceDisconnected ");
mBluetoothPan.set(null);
}
};
*/
/*
btadapter.getProfileProxy(context,mProfileServiceListener,BluetoothProfile.PAN);*/
}
/*
BluetoothPan pan = mBluetoothPan.get();
try{
if (pan != null)pan.setBluetoothTethering(true);
*/
注意!!!!到此功能完成了,但还有个bug,就是刷机第一次立马输入暗码打开,蓝牙网络共享不会即时刷新,除非再输入打开一遍就可以。
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/TetherSettings.java
原因:private void updateBluetoothState() {
里面判断逻辑
if(btState == BluetoothAdapter.STATE_ON && bluetoothPan != null
&&bluetoothPan.isTetheringOn()) {
mBluetoothTether.setChecked(true);
打log看第一次bluetoothPan.isTetheringOn()
就是没连上,第二次才可以
解决:
手动点击蓝牙网络共享后,赋值1,
public boolean onPreferenceTreeClick(Preference preference) {
else if(preference == mBluetoothTether) {
android.os.SystemProperties.set("persist.sys.bt_tether.click","1");
在onstart的最后加入
if("1".equals(android.os.SystemProperties.get("persist.sys.internet_share","0")) && "0".equals(android.os.SystemProperties.get("persist.sys.bt_tether.click","0")) ) {
startTethering(TETHERING_BLUETOOTH);
}
客户需求:
默认三个选项都无法选择,只有打开暗码之后才恢复原生设计,关闭之后又置灰无法选择。
还是在src/com/android/settings/TetherSettings.java
在更新方法private void updateState(){
最后加上
if("0".equals(android.os.SystemProperties.get("persist.sys.internet_share","0"))){
mUsbTether.setEnabled(false);
mBluetoothTether.setEnabled(false);
mEthernetTether.setEnabled(false);
}
包括下拉菜单点进去的usb偏好设置里面的usb网络共享也同理
在
vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java
这个文件就是usb偏好设置的界面控制逻辑
在
private RadioButtonPreference getProfilePreference(String key, int titleId) {
最后返回值前面加入
if(key.equals("100000")&&"0".equals(android.os.SystemProperties.get("persist.sys.internet_share","0"))){
pref.setEnabled(false);
}
这个方法就是设置每个菜单选项的点击事件以及标题啊等等,比如mtp,usb共享,midi,ptp。这里面的key等于100000是通过打log得出来的,在点击事件中去获取该菜单的key值
public void onRadioButtonClicked(RadioButtonPreference preference) {
源码有设计
final long function =UsbBackend.usbFunctionsFromString(preference.getKey());
if (function == UsbManager.FUNCTION_RNDIS) {
加入
android.util.Log.i("yantao","preference key=="+preference.getKey());
解析与所得:
关闭所有共享可以直接mTetheringManager.stopAllTethering();
也可以用这个类的stopTethering(type),就是mTetheringManager.stopTethering(TETHERING_USB),一个个关
开启功能可以用ConnectivityManager,其实这个类本质上还是转到TetheringManager,但是全程只需要自己这个类就行,相当于给你封装好了
mCm.startTethering(TETHERING_ETHERNET, true,new ConnectivityManager.OnStartTetheringCallback(){
});
注意第三个参数这个callback不能为null,必须重新new一个,这是个类,哪怕里面都是空的不用复写也可以
也可以用,不过这又多了两个类了TetheringRequest,ConcurrentUtils不建议使用
tm.startTethering(newTetheringRequest.Builder(TETHERING_ETHERNET).build(),
ConcurrentUtils.DIRECT_EXECUTOR, newTetheringManager.StartTetheringCallback() {
@Override
public voidonTetheringFailed(final int result) {
}
});
当然这个方法也可以不复写
importandroid.net.TetheringManager.TetheringRequest;
import com.android.internal.util.ConcurrentUtils
设置里热点和网络共享,有三个switchpreference。
mUsbTether = (SwitchPreference)findPreference(KEY_USB_TETHER_SETTINGS);
mBluetoothTether = (SwitchPreference)findPreference(KEY_ENABLE_BLUETOOTH_TETHERING);
mEthernetTether = (SwitchPreference)findPreference(KEY_ENABLE_ETHERNET_TETHERING);
这里面关闭某共享是
mUsbTether.setEnabled(!mDataSaverEnabled);
mUsbTether.setChecked(false);
mCm.stopTethering(TETHERING_USB);
转到设置里的指定界面
import android.content.ComponentName;
ComponentName cm = newComponentName("com.android.settings","com.android.settings.TetherSettings");
Intent goSetting = newIntent();
goSetting.setComponent(cm);
goSetting.setAction("android.intent.action.VIEW");
goSetting.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(goSetting);
这个必须得是activity类型的设置界面才可以,就是里面有正常的生命周期
也可以用
Intent intent = newIntent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
这个是进入开发者所在菜单
frameworks/base/core/java/android/provider/Settings.java里面有很多原生的这种action
再暗码操作时这个方法
static boolean handleSecretCode(Contextcontext, String input) {
也可以做下整理,意思就是所有暗码都以*#开头已#结尾
if (input.length() > 3 &&input.startsWith("*#") && input.endsWith("#")) {
String secretCode = input.substring(2, input.length() - 1);
if (secretCode.equals("18818")) {