java - 奥利奥 Wifi 热点创建失败

标签 java android android-wifi android-8.0-oreo android-8.1-oreo

我正在 Oreo AOSP 中开发一个简单的系统应用程序,以使用预定义的 SSID 和预共享 key 打开 wifi 热点。

因为我的应用程序是作为系统应用程序构建的,所以我不需要反射。

主 Activity .java

public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                boolean result = false;
                WifiManager mwifiManager;
                mwifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);

                try {
                        Method method = mwifiManager.getClass().getMethod("getWifiApConfiguration");
                        WifiConfiguration netconfig = (WifiConfiguration) method.invoke(mwifiManager);
                        netconfig.SSID = "DummyApp";
                        netconfig.preSharedKey = "1234567890";
                        netconfig.allowedKeyManagement.set(4);
                        mwifiManager.setWifiEnabled(false);
                        method = mwifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
                        result = (boolean) method.invoke(mwifiManager, netconfig, true);
                        if (!result) {
                                Toast.makeText(this, "Hotspot creation failed", Toast.LENGTH_SHORT).show();
                        } else {
                                Toast.makeText(this, "Wifi Enabled", Toast.LENGTH_SHORT).show();
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
                finish();
        }

        @Override
        protected void onResume() {
                super.onResume();
        }
}

AndroidManifest.xml

    android:protectionLevel="signature|privileged"
    android:sharedUserId="android.uid.system">
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- for wifi  -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.TETHER_PRIVILEGED" />

Wifi 应该打开但得到以下结果:

Toast 消息:热点创建失败

Logcat:WifiManager:PACKAGE_NAME 已尝试调用 setWifiApEnabled:enabled = true

更新 1:How to turn on/off wifi hotspot programmatically in Android 8.0 (Oreo)

我已经尝试过上述更改。它将在本地打开热点,但没有自定义 SSID 和密码。

更新 2:从@Mr.AF 获得输入后。

Method setConfigMethod = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
                                                                                 ......code snip.........

netconfig.allowedKeyManagement.set(4);
Method Method = mWifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);

HOTSPOT 创建失败

最佳答案

在 Android Nougat 和以下代码中打开可移植热点。

   Method method = mwifiManager.getClass().getMethod("getWifiApConfiguration");
   WifiConfiguration netconfig = (WifiConfiguration) method.invoke(mwifiManager);
   method = mwifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
   result = (boolean) method.invoke(mwifiManager, netconfig, true);

以上 API 在 Oreo 中已弃用。

下面是oreo中@system隐藏的API,如果android应用程序是作为系统应用程序构建的,那么只能访问下面的API代码。就我而言,我可以使用以下 API。

   ConnectivityManager oncm = (ConnectivityManager)ontext.getSystemService(Context.CONNECTIVITY_SERVICE);

   oncm.startTethering(ConnectivityManager.TETHERING_WIFI, true, new ConnectivityManager.OnStartTetheringCallback() {

   @Override
   public void onTetheringStarted() {
          super.onTetheringStarted();
          Log.i(TAG, "Hotspot is successfully opened");
   }

   @Override
   public void onTetheringFailed() {
          super.onTetheringFailed();
          Log.e(TAG, "Hotspot failed to open");
   }
 });

关于java - 奥利奥 Wifi 热点创建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55567416/

相关文章:

java - 如何将 java.util.Optional 映射到 jersey 客户端

android - 插件太旧,请更新到最新版本,或将 ANDROID_DAILY_OVERRIDE 环境变量设置为

c# - 我面临着对 IEnumerable(LINQ) > List(RecyclerView) 的巨大性能影响

android - 在哪里可以找到完整的 SGS I-9000 froyo 源代码?

java - WifiP2p:我的 Activity 不使用BroadcastReceiver(我认为..)

android - wpl_cli :not found with rooted android device?

java - 如果屏幕最小化,如何防止Java删除内容?

java - 如何在 Java 中检索 Line2D 的坐标

java - Spring Boot 应用程序未在 openWRT 上运行

安卓:谷歌认证