3

私がMarshmallowにアップグレードすると、アプリケーションが動作を停止しました。WiFi接続を変更することができましたが、今は何もしません。Android 6.0でアプリケーション(Wi-Fi接続)がもう動作しません。Marshmallow

私はAndroid 6.0の新しいアクセス許可モデルについて読んだことがあります。うーん、すごいですが、古いアプリは引き続き動作するはずです...とにかく、私は許可の付与を実装しようとしましたが、これは通常の許可であり、アンドロイドのマニフェストで定義されている場合、許可要求は行われません。

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

許可は常にAndroidマニフェストにあります。私が正しく理解していれば、それは「通常の許可」のため動作するはずです。だから、なぜそれは動作しません、誰かが解決策を持っていますか?以来があったことCHANGE_WIFI_STATE権限は、あります前に述べたようにAndroidManifestで

public static void connectToWifi(Context context, String ssid, String password) { 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    // setup a wifi configuration 
     WifiConfiguration wc = new WifiConfiguration(); 
     wc.SSID = "\"" + ssid + "\""; 
     wc.preSharedKey = "\""+ password + "\""; 
     wc.status = WifiConfiguration.Status.ENABLED; 
     wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
     wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
     wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
     wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
     wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
     wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
    // connect to and enable the connection 
    int netId = wifiManager.addNetwork(wc); 
    wifiManager.enableNetwork(netId, true); 
    wifiManager.setWifiEnabled(true); 
} 

protected void connectWifi() { 
    if ((!connectedToAccessPoint(settings.getMainConnectionName())) 
      && (accessPointIsAvailable(settings.getMainConnectionName()))) { 
     ConnectionUtils.connectToWifi(this, 
       settings.getMainConnectionName(), 
       settings.getMainConnectionPassword()); 
     Toast.makeText(this, 
       "Connecting to " + settings.getMainConnectionName(), 
       Toast.LENGTH_LONG).show(); 
     handler.postDelayed(sendUpdatesToUI, 
       DelayConstants.BASIC_REQUEST_SENT); 
     handler.postDelayed(sendUpdatesToUI, 
       DelayConstants.CHANGE_CONNECTION); 
    } 
} 

そして、ここでの接続のための技術的な部分:私の場合に関連するコードの断片を追加

Android 6.0を搭載していない端末でアプリが実行されていた

+0

[mcve]を入力してください。誰もあなたに見えないコードを教えてくれる人はいません。 – CommonsWare

+0

@CommonsWare申し訳ありませんが、私はいつもやっていますが、今回は私がここに投稿する必要があることを他の人に知らせることはありませんでしたか?どんなコードが正確に必要ですか?また、私はコンセプトを正しく理解していることを確認できますか?私はこの許可を与える許可をしてはいけないのですか? –

+0

"ほかに何を投稿する必要がありますか?" - 「WiFi接続を変更できると思われる」コードを投稿し、「何もしない」という内容を確認することができます。 "私はこの許可を与える許可をしてはいけないのですか?" - それはAndroid 6.0の通常の許可なので、特別なことをする必要はありません。しかし、他のものが変更されています(例えば、 'WifiManager.getScanResults()'はロケーション許可を必要とし、 'WifiConfiguration'への変更は制限されています)。 – CommonsWare

答えて

2

私は結局、コメントと読者の助けを借りてウェブ上で。結局のところ、権限の問題でした。

それはそれは細かい場所や粗い場所のいずれかであるので、あなたの場所にアクセスする必要があるのAndroid 6.0からの接続をスキャンし、私は私のマニフェストファイルに以下を追加したとき、それはWifiManagerとうまく動作するためには思える:

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

接続前に接続が利用可能かどうかをチェックしていたので、それはうまくいかないため、アクセス許可がないためにネットワークスキャンから常に0の結果が返されました。したがって、標準的な方法では、ACCESS_COARSE_LOCATION権限を要求するために実装を行う必要があります。その後、Androidで現在地設定を有効にしていない限り、機能しません。毎回場所をオンにする必要がある場合、実際には私のアプリケーションはかなり役に立たなくなります。

最後に、私はアクセスポイントが利用可能かどうかをチェックせずに試行するtry-catchステートメントそれに接続します。それは醜いですが、それは新しいAndroidの唯一の方法です。

私は新しいアクセス許可モデルが好きですが、明らかにGoogleはいくつかの点でそれを実装しています。 WiFiスキャンの結果を得るには、現在地をオンにする必要がありますか?それがなくてもAndroid 6.0より前に動作していたので意味がありません。私は場所の許可については理解していますが、WiFi上で利用可能なものをスキャンできるように実際に場所をオンにしなければならないということは、間違っています...

+0

誰かがこの回答に遭遇した場合に備えて、これに追加するだけです。接続するネットワークを最初にスキャンする必要がある場合に備えて、ロケーションサービスを有効にする必要があります。 Googleは、スキャンとスキャンの結果がプライバシーに関する問題であり、ユーザーが権限付与を制御できるようにロケーションサービス要件を追加したと感じていたと思います。 – Bruce

1

優れたチュートリアルのアドバイス:

マシュマロの*アプリケーションはACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATIONの許可が必要と場所のサービスは、無線LANのスキャンが

あなたはでこの詳細については読むことができ、その結果を得るために有効にする必要があります。 http://www.intentfilter.com/2016/08/programatically-connecting-to-wifi.html

から始まる制限事項については、Marshmallowを参照してください。アプリはそれらのWiFiネットワークのみを変更できますそれが作成した帽子。このシステムでは、他のアプリやユーザーが作成したネットワークを変更することはできません。したがって、ネットワークが既にリストに存在する場合、ネットワークの追加が失敗する可能性があります(システムが検出されると、ネットワークに自動的に接続される可能性があります)。

関連する問題