拨号动态开关USB网络共享、以太网络共享与蓝牙网络共享功能,*#18819#打开,*#18818#关闭。转到设置里的指定界面

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")) {

猜你喜欢

转载自blog.csdn.net/youthking1314/article/details/129620841
今日推荐