繁体   English   中英

以编程方式使 Wifi 热点在 7.0 中不起作用

[英]Turning Wifi Hotspot not working in 7.0 nought programmatically

我在Samsung J200F中测试这些代码时效果最好,但是当我在Lenovo 7.0 中测试这些代码时 Android Naught它们不起作用。 Logcat中没有任何例外。 我已经在运行时AndroidManifest添加了这些权限

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

有用于打开/关闭我的 Wifi 热点的代码。


public class HotspotControl {

   
    private static Method getWifiApConfiguration;
    private static Method getWifiApState;
    private static Method isWifiApEnabled;
    private static Method setWifiApEnabled;
    private static Method setWifiApConfiguration;

    private WifiManager wm;
    private String deviceName;

    private WifiManager.LocalOnlyHotspotReservation mReservation;

    private static HotspotControl instance = null;
    

    static {
        for (Method method : WifiManager.class.getDeclaredMethods()) {
            switch (method.getName()) {
                case "getWifiApConfiguration":
                    getWifiApConfiguration = method;
                    break;
                case "getWifiApState":
                    getWifiApState = method;
                    break;
                case "isWifiApEnabled":
                    isWifiApEnabled = method;
                    break;
                case "setWifiApEnabled":
                    setWifiApEnabled = method;
                    break;
                case "setWifiApConfiguration":
                    setWifiApConfiguration = method;
                    break;
            }
        }
    }

    private HotspotControl(Context context) {
        wm = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        
    }



public boolean turnOnPreOreoHotspot(String name) {
        wm.setWifiEnabled(false);

        //Create new Open Wifi Configuration
        WifiConfiguration wifiConf = new WifiConfiguration();
        wifiConf.SSID = "\"" + name + "\"";
        
        wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wm.addNetwork(wifiConf);
        wm.saveConfiguration();
        return setHotspotEnabled(wifiConf, true);
    }



private boolean setHotspotEnabled(WifiConfiguration config, boolean enabled) {
        Object result = invokeSilently(setWifiApEnabled, wm, config, enabled);
        if (result == null) {
            return false;
        }
        return (Boolean) result;
    }



private static Object invokeSilently(Method method, Object receiver, Object... args) {
        try {
            return method.invoke(receiver, args);
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            Log.e(TAG, "exception in invoking methods: " + e.getMessage());
        }
        return null;
    }



}

在这种情况下你能帮帮我吗? 提前致谢。

有一个请求许可的完整示例,适用于所有版本。 它适用于 Version<=23,7.0(Nought), Version >=23。 只需在onCreate()中添加checkLocationPermission( ) 即可。


    // Check for GPS permission

    private boolean checkLocationPermission() {
        if (Build.VERSION.SDK_INT >= 23 )
            if(getContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED || getContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || getContext().checkSelfPermission(Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED   || getContext().checkSelfPermission(Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED ) {
            ActivityCompat.requestPermissions(
                getActivity(),
                new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_WIFI_STATE,Manifest.permission.CHANGE_WIFI_STATE},
                PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION
            );
            return false;
        }
        return true;
    }
    private boolean showWritePermissionSettings() {    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M  
            && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { 
            if (!Settings.System.canWrite(getContext())) {    
                Log.v("DANG", " " + !Settings.System.canWrite(getContext()));   
                Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS); 
                intent.setData(Uri.parse("package:" + getContext().getPackageName()));  
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
                this.startActivity(intent); 
                return false;   
            } 
        }   
        return true; //Permission already given 
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (showWritePermissionSettings())
                        Logic();
                } else {
                    // else type 1st
                    // dialog interface start 1st
                    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)) {
                        // dialog 
                        showOptionsDialogWithListners(getString(R.string.p2p_receiver_gps_permission_warning), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    checkLocationPermission();
                                }
                            }, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();

                                }
                            }, "Re-Try", "Yes, Im Sure");
                        // dialog interface end 1st
                    } // else type 2nd
                    else {
                        // dialog interface 2nd start
                        showOptionsDialogWithListners(getString(R.string.p2p_receiver_gps_no_permission_prompt), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    try {
                                        Intent intent = new Intent();
                                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                        Uri uri = Uri.fromParts("package", getContext().getPackageName(), null);
                                        intent.setData(uri);
                                        startActivity(intent);
                                    } catch (ActivityNotFoundException anf) {
                                        Toast.makeText(getContext(), "Settings activity not found", Toast.LENGTH_SHORT).show();
                                    }
                                }
                            }, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.cancel();
                                }
                            }, getString(R.string.label_settings), getString(R.string.Action_cancel));
                        // dialog interfaces 2nd ended
                    }
                    // else type 2nd start
                }
                // else 1st ended
                break;


        }

    }


    // Dialog with interfaces
    public void showOptionsDialogWithListners(String message,
                                              DialogInterface.OnClickListener pListner,
                                              DialogInterface.OnClickListener nListener, String pButtonText,
                                              String nButtonText) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppCompatAlertDialogStyle);
        builder.setCancelable(false);
        builder.setMessage(Html.fromHtml(message));
        builder.setPositiveButton(pButtonText, pListner);
        builder.setNegativeButton(nButtonText, null != nListener ? nListener
                                  : new DialogInterface.OnClickListener() {

                                      @Override
                                      public void onClick(DialogInterface dialog, int which) {
                                          dialog.cancel();
                                          return;
                                      }
                                  });
        builder.show();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM