Запрос разрешения Wi-Fi при запуске приложения Gluon-Mobile во время выполнения

Мое приложение хочет запросить разрешение Wi-Fi при запуске. До сих пор мне удавалось дать разрешение через Настройка. Но я больше не хочу этого делать. До сих пор я видел этот предыдущий Вопрос. Я мог немного понять. Но этого не достаточно. Я создал .class, который управляет Активностью Wi-Fi, такой как включение / выключение, проверка состояния Wi-Fi. Это хорошо работает, если разрешение Wi-Fi предоставлено. Но если нет, то это не работает.
Вот WifiController.class, который я создал.

import android.content.Context;
import android.net.wifi.WifiManager;
import javafxports.android.FXActivity;


public class WifiController implements WifiInterface
{

WifiManager wifiManager=null;

WifiController()
{
    wifiManager = (WifiManager)FXActivity.getInstance().getSystemService(Context.WIFI_SERVICE);
}

WifiManager getWifimanager()
{
    return wifiManager;
}

public boolean isTurnedOn()
{
    return wifiManager.isWifiEnabled();
}

public boolean turnOn()
{
    wifiManager.setWifiEnabled(true);
    return true;
}

public boolean turnOff()
{
    wifiManager.setWifiEnabled(false);
    return true;
}

}

Пожалуйста, просветите меня. Заранее спасибо.

3 ответа

Вы запросили разрешение во время выполнения:

if (ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {


if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_EXTERNAL_STORAGE)) {

    // Show an explanation to the user *asynchronously* -- don't block
    // this thread waiting for the user's response! After the user
    // sees the explanation, try again to request the permission.

} else {

    // No explanation needed, we can request the permission.

    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_PERMISSION);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant. The callback method gets the
    // result of the request.
}
}

и чем делать то, что вы когда-либо хотите (если пользователь имеет разрешение):

@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // Permission granted.
    } else {
        // User refused to grant permission.
    }
}
}

Вы можете прочитать больше здесь: https://developer.android.com/training/permissions/requesting.html

На сайте разработчиков Android есть отличный пример того, как работают разрешения времени выполнения:

https://developer.android.com/training/permissions/requesting.html

Также не забудьте добавить разрешения в свой манифест.

Основываясь на этом ответе, я создал следующий класс для запроса разрешений на запуск приложения, когда версия для Android>= Marshmallow:

public class AndroidPlatform {

    private static final String KEY_PERMISSIONS              = "permissions";
    private static final String KEY_REQUEST_CODE             = "requestCode";
    private static final int    REQUEST_CODE_ASK_PERMISSIONS = 246;
    private static final int    REQUEST_CODE                 = 123;

    private final FXActivity    activity;

    public AndroidPlatform() {
        activity = FXActivity.getInstance();
    }

    public void checkPermissions() {
        if (Build.VERSION.SDK_INT >= MARSHMALLOW) {

            List<String> requiredPermissions = new ArrayList<>();
            addPermission(activity, requiredPermissions , Manifest.permission.ACCESS_COARSE_LOCATION);
            // additional required permissions

            if (!requiredPermissions.isEmpty()) {
                Intent permIntent = new Intent(activity, PermissionRequestActivity.class);
                permIntent.putExtra(KEY_PERMISSIONS, requiredPermissions.toArray(new String[requiredPermissions .size()]));
                permIntent.putExtra(KEY_REQUEST_CODE, REQUEST_CODE);
                activity.startActivityForResult(permIntent, REQUEST_CODE_ASK_PERMISSIONS);
            }
        }
    }

    private void addPermission(Activity activity, List<String> permissionsList, String permission) {
        if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
        }
    }

    public static class PermissionRequestActivity extends Activity {

        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            FXActivity.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
            finish();
        }

        @Override
        protected void onStart() {
            super.onStart();
            String[] permissions = this.getIntent().getStringArrayExtra(KEY_PERMISSIONS);
            int requestCode = this.getIntent().getIntExtra(KEY_REQUEST_CODE, 0);

            ActivityCompat.requestPermissions(this, permissions, requestCode);
        }
    }

}

В вашем AndroidManifest.xml вы должны добавить соответствующее действие:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<activity android:name="yourpackage.AndroidPlatform$PermissionRequestActivity" />

Также вы должны добавить библиотеку android-support-library в ваш build.gradle:

dependencies {
    androidCompile files('libs/android-support-v4.jar')
    compileNoRetrolambda files('libs/android-support-v4.jar')
}

Для получения дополнительной информации относительно wifiManager / permissions см. Ссылку

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