Постоянное получение значений Wifi RSSI Приложение для Android не запускается

Я написал приложение для Android, чтобы получить значения Wi-Fi RSSI без подключения к сетям Wi-Fi.

вот код

package com.affno.wifirssichecker;

import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import static com.affno.wifirssichecker.R.id.RSSI;

public class MainActivity extends AppCompatActivity {

TextView rssiView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    rssiView = (TextView)findViewById(RSSI);

    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    ScanResult result0 = (ScanResult) wifi.getScanResults();
    String ssid = result0.SSID;
    int rssi = result0.level;
    String rssiString0 = String.valueOf(rssi);
    rssiView.setText("\n" + ssid + "   " + rssiString0);
}
}

Но когда я развернул это приложение на своем устройстве Android, приложение не запустится. просто всплыл и затем исчез. Я не могу понять, в чем проблема. Может кто-нибудь мне помочь.

Но я заметил, что в районе есть несколько сетей Wi-Fi, которые я тестировал это приложение. Проблема возникает из-за этого?

Что я хочу, чтобы проверить значения RSSI каждой сети Wi-Fi с SSID или MAC постоянно в моем районе.

И я хочу знать, могу ли я это сделать?

1 ответ

Я думаю, вам нужно получить разрешения Wi-Fi и местоположения. В Android Marshmallow и выше вам необходимо получить это разрешение во время выполнения.

вот мой код!!Mainifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wifi">

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>`

MainActivity.java

package com.example.wifi;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private WifiManager mwifiManager;

private List<ScanResult> results;
private ArrayList<String> arrayList = new ArrayList<>();
private ArrayAdapter<String> adapter;

private int REQUEST_PERMISSION_CODE = 1;

private String[] Permissions = {Manifest.permission.ACCESS_COARSE_LOCATION,
                                Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_WIFI_STATE,
                                Manifest.permission.CHANGE_WIFI_STATE};

boolean start ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button scan_btn = (Button) findViewById(R.id.button);
    ListView list = (ListView) findViewById(R.id.list);


    scan_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            scan_wifi();
        }
    });

}

@Override
protected void onStart() {
    super.onStart();
    requestPermissions();
}

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

    scan_wifi();
}

private void scan_wifi(){
    if(start){
        mwifiManager = (WifiManager) 
getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if (!mwifiManager.isWifiEnabled()) {
            Toast.makeText(this, "WIFI DISABLED", Toast.LENGTH_LONG).show();
            mwifiManager.setWifiEnabled(true);
        }

        registerReceiver(wifireceiver,new 
IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        mwifiManager.startScan();
        Toast.makeText(this,"SCANING",Toast.LENGTH_LONG).show();
    }
    else {
        /* GET RUN TIME PERMISSION*/
        requestPermissions();

    }
}

private void requestPermissions() {
    if (    (ContextCompat.checkSelfPermission(this, Permissions[0]) != 
PackageManager.PERMISSION_GRANTED)||
            (ContextCompat.checkSelfPermission(this, Permissions[1]) != 
PackageManager.PERMISSION_GRANTED)||
            (ContextCompat.checkSelfPermission(this, Permissions[2]) != 
PackageManager.PERMISSION_GRANTED)||
            (ContextCompat.checkSelfPermission(this, Permissions[3]) != 
PackageManager.PERMISSION_GRANTED)) {

        ActivityCompat.requestPermissions(this, new String[]{Permissions[0],
                                                                    Permissions[1],
                                                                    Permissions[2],
                                                                    Permissions[3]},
                                            REQUEST_PERMISSION_CODE);

    } else {
        //Toast.makeText(this, "Permission alredy granted", 
Toast.LENGTH_SHORT).show();
        start = true;
    }
}

BroadcastReceiver wifireceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        TextView tx = (TextView) findViewById(R.id.textView);
        tx.setText("WIFI LIST \n");

        results = mwifiManager.getScanResults();
        unregisterReceiver(this);

        results = mwifiManager.getScanResults();
        Log.d("Wifi", String.valueOf(results.size()));
        for (ScanResult res : results) {
            tx.append("SSID :" +res.SSID + "Capblt :" + res.capabilities+ "\n");

        }

    }
};


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] 
grantResults) {

    if(requestCode == REQUEST_PERMISSION_CODE){
        if (grantResults.length > 0 && grantResults[0] == 
PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
            start = true;

        }
        else {
            Toast.makeText(this, "Permission not granted", 
Toast.LENGTH_SHORT).show();
            start = false;
        }
    }
    }





}

Не удалось найти точное решение. Но я понимаю, в чем проблема. Я использовал устройство Android, которое работает на Android версии 6.0. Таким образом, в Android 6.0 поведение разрешений изменилось на время выполнения.

Так что в этом случае мне нужно разрешение на сканирование сетей Wi-Fi. Поэтому мне нужно проверить, было ли дано разрешение ранее. Если да, то мы можем запустить приложение, если не произойдет сбой приложения. Но не смог найти точный способ решить эту проблему.

Другие вопросы по тегам