Запрос разрешения 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 см. Ссылку