Android softap 打开流程

基于Android S 代码:http://aospxref.com/android-13.0.0_r3/

界面代码:http://aospxref.com/android-13.0.0_r3/xref/packages/apps/Settings/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java#onSwitchChanged
onSwitchChanged —> startTether()

    void startTether() {
   
   
        if (isWifiApActivated()) return;
        mSwitchBar.setEnabled(false);
        mConnectivityManager.startTethering(TETHERING_WIFI, true /* showProvisioningUi */,   ---> 继续看
                mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
    }

http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java#2892

public void startTethering(int type, boolean showProvisioningUi,
        final OnStartTetheringCallback callback, Handler handler) {
   
   
    Objects.requireNonNull(callback, "OnStartTetheringCallback cannot be null.");

    // 创建一个执行器,用于在合适的线程上执行回调任务
    final Executor executor = new Executor() {
   
   
        @Override
        public void execute(Runnable command) {
   
   
            if (handler == null) {
   
   
                // 如果没有传入 Handler,则直接运行任务
                command.run();
            } else {
   
   
                // 如果传入了 Handler,则在主线程上执行任务
                handler.post(command);
            }
        }
    };

    // 创建一个 StartTetheringCallback 对象,用于接收启动网络共享的回调事件
    final StartTetheringCallback tetheringCallback = new StartTetheringCallback() {
   
   
        @Override
        public void onTetheringStarted() {
   
   
            // 当网络共享启动时,调用传入的回调对象的相应方法
            callback.onTetheringStarted();
        }

        @Override
        public void onTetheringFailed(final int error) {
   
   
            // 当网络共享启动失败时,调用传入的回调对象的相应方法
            callback.onTetheringFailed();
        }
    };

    // 构建一个 TetheringRequest 对象,用于描述网络共享的请求参数
    final TetheringRequest request = new TetheringRequest.Builder(type)
            .setShouldShowEntitlementUi(showProvisioningUi).build();

    // 获取 TetheringManager 对象,并调用其 startTethering() 方法启动网络共享
    getTetheringManager().startTethering(request, executor, tetheringCallback);
}

/packages/modules/Connectivity/Tethering/common/TetheringLib/src/android/net/TetheringManager.java

    public void startTethering(@NonNull final TetheringRequest request,
            @NonNull final Executor executor, @NonNull final StartTetheringCallback callback) {
   
   
        final String callerPkg = mContext.getOpPackageName();
        Log.i(TAG, "startTethering caller:" + callerPkg);

        final IIntResultListener listener = new IIntResultListener.Stub() {
   
   
            @Override
            public void onResult(final int resultCode) {
   
   
                executor.execute(() -> {
   
   
                    if (resultCode == TETHER_ERROR_NO_ERROR) {
   
   
                        callback.onTetheringStarted();
                    } else {
   
   
                        callback.onTetheringFailed(resultCode);
                    }
                });
            }
        };
        getConnector(c -> c.startTethering(request.getParcel(), callerPkg,
                getAttributionTag(), listener));
    }

http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/TetheringService.java#startTethering
然后调用到:http://aospxref.com/android-13.0.0_r3/xref/packages/modules/Connectivity/Tethering/src/com/android/networkstack/tethering/Tethering.java#startTethering

    void startTethering(final TetheringRequestParcel request, final IIntResultListener listener) {
   
   
        mHandler.post(() -> {
   
   
            final TetheringRequestParcel unfinishedRequest = mActiveTetheringRequests.get(
                    request.tetheringType);
            // If tethering is already enabled with a different request,
            // disable before re-enabling.
            if (unfinishedRequest != null
                    && !TetheringUtils.isTetheringRequestEquals(unfinishedRequest, request)) {
   
   
                enableTetheringInternal(request.tetheringType, false /* disabled */, null);
                mEntitlementMgr.stopProvisioningIfNeeded(request.tetheringType);
            }
            mActiveTetheringRequests.put(request.tetheringType, request);

            if (request.exemptFromEntitlementCheck<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值