Gluon Mobile - Android: запрашивать разрешение на местоположение при доступе к местоположению - PullRequest
0 голосов
/ 19 мая 2018

Мы показываем местоположение пользователей на карте в нашем приложении на основе Gluon.Это прекрасно работает (с некоторыми мелочами, которые нам еще нужно настроить), если у пользователя включено «местоположение».Однако, когда он не включен, приложение вылетает.«AndroidManifest.xml» содержит необходимые строки разрешений.Мы попробовали несколько версий Android, начиная с 5.1.1 до 6.0.1 до 7.1.1, чтобы проверить, связано ли это с самой версией Android.

С другой стороны, когда мы используем наше приложение наiPhone, система обрабатывает этот запрос и предлагает пользователю разрешить доступ к местоположению.Даже если пользователь отрицает , приложение не аварийно завершает работу.

Есть ли способ реализовать такое же поведение для Android?

Редактировать длялучшее понимание: jfxmobile версия 1.3.10

AndroidManifest.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ch" android:versionCode="1"
          android:versionName="0.9.6 Beta">
    <supports-screens android:xlargeScreens="true"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="23"/>

    <application android:label="BodenDok" android:name="android.support.multidex.MultiDexApplication"
                 android:icon="@mipmap/ic_launcher"
                 android:largeHeap="true">
        <activity android:name="javafxports.android.FXActivity" android:label="BodenDok"
                  android:screenOrientation="portrait"
                  android:configChanges="orientation|screenSize">
            <meta-data android:name="main.class" android:value="ch.BodenDok"/>
            <meta-data android:name="debug.port" android:value="0"/>
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Permission request, Android 23+ -->
        <activity android:name="com.gluonhq.impl.charm.down.plugins.android.PermissionRequestActivity" />

        <activity android:name="com.gluonhq.impl.charm.down.plugins.android.NotificationActivity"
                  android:parentActivityName="javafxports.android.FXActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                       android:value="javafxports.android.FXActivity"/>
        </activity>
        <receiver android:name="com.gluonhq.impl.charm.down.plugins.android.AlarmReceiver" />
    </application>
</manifest>

build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.3.10'
    }
}

apply plugin: 'org.javafxports.jfxmobile'
apply plugin: 'checkstyle'

ext.checkstyleVersion    = '8.3'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'ch.BodenDok'

dependencies {
    compile 'com.gluonhq:charm:5.0.0'
    // https://mvnrepository.com/artifact/org.controlsfx/controlsfx
    compile group: 'org.controlsfx', name: 'controlsfx', version: '8.40.14'

    testCompile 'junit:junit:4.12'
}

jfxmobile {
    downConfig {
        version = '3.8.0'
        // Do not edit the line below. Use Gluon Mobile Settings in your project context menu instead
        plugins 'compass', 'display', 'lifecycle', 'local-notifications', 'magnetometer', 'pictures', 'position', 'runtime-args', 'settings', 'share', 'statusbar', 'storage'
    }
    android {
        manifest = 'src/android/AndroidManifest.xml'
        compileSdkVersion = 25
    }
    ios {
        infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = [
                'com.gluonhq.**.*',
                'javax.annotations.**.*',
                'javax.inject.**.*',
                'javax.json.**.*',
                'org.glassfish.json.**.*'
        ]
    }
}

checkstyle {
    toolVersion ="${checkstyleVersion}"
    configFile = project(':').file('config/checkstyle/checkstyle.xml')
    configProperties = [ "suppressionFile" : project(':').file('config/checkstyle/suppressions.xml')]
}

РЕДАКТИРОВАТЬ: Кажется, что линия

 <activity android:name="com.gluonhq.impl.charm.down.plugins.android.PermissionRequestActivity" />

, предложенный Хосе Переда, не был внутри тега приложения.Теперь Android 7.1.2 показывает непосредственно экран местоположения, Android 5.1.1 по-прежнему вылетает приложение.Есть ли способ спросить, какая версия Android работает?Например, «Platform.Android.version» или «MobileApplication.Android.version», чтобы мы могли соответственно отловить ошибку?

1 Ответ

0 голосов
/ 19 мая 2018

Хорошо, уловка в том, чтобы использовать явный Broadcast Receiver здесь.В этом коде, когда GPS не подключен или выключен, будет отображаться диалоговое окно, предупреждающее вас о соединении NO Gps, нажав «Повторить», вы попадете на страницу настроек, где вы сможете включить GPS.

Явный метод для Broadcast Receiver

 private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
      if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
          checkGPS();
      }

  }  };

Для запроса разрешений у пользователя (Runtime Permissions)

  public boolean checkLocationpermission() {
  if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
          ActivityCompat.requestPermissions(this, new String[] {
              Manifest.permission.ACCESS_FINE_LOCATION
          }, 1001);
      } else {
          ActivityCompat.requestPermissions(this, new String[] {
              Manifest.permission.ACCESS_FINE_LOCATION
          }, 1003);

      }
      return false;
  } else
      return true;  }

Метод CheckGps

 public void checkGPS() {
 builder = new AlertDialog.Builder(this);
 builder.setTitle("NO GPS");
 if (isGPSready()) {
     System.out.println("GPs Connected");
 } else {
     builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
         @Override
         public void onClick(DialogInterface dialogInterface, int i) {
             if (!isGPSready()) {
                 startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 1001);

                 builder.show();
             } else if (isGPSready()) {
                 System.out.println("the connection is succsful");

             }
         }
     }).setNegativeButton("No", new DialogInterface.OnClickListener() {
         @Override
         public void onClick(DialogInterface dialogInterface, int i) {
             finish();
         }
     });
     builder.show();
 } }

Метод onActivityResult

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == 1001) {
       if (mLocationManager == null) {
           mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
       } else if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
           checkGPS();
       }

   }
   super.onActivityResult(requestCode, resultCode, data);   }

Вот полный код

открытый класс MainActivity расширяет AppCompatActivity {

AlertDialog.Builder builder;
LocationManager mLocationManager;

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
            //isGPSready();
            checkGPS();
        }

    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    checkLocationpermission();
    checkGPS();
    registerReceiver(broadcastReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));
}
public boolean isGPSready() {
    mLocationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
    return mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

public void checkGPS() {
    builder = new AlertDialog.Builder(this);
    builder.setTitle("NO GPS");
    builder.setMessage("Click on Retry to get connected to GPS");
    if (isGPSready()) {
        System.out.println("GPs Connected");
    } else {
        builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                if (!isGPSready()) {
                    startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 1001);
                    builder.show();
                } else if (isGPSready()) {
                    System.out.println("the connection is succsful");

                }
            }
        }).setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                finish();
            }
        });
        builder.show();
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1001) {
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        } else if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            checkGPS();
        }

    }
    super.onActivityResult(requestCode, resultCode, data);

}

public boolean checkLocationpermission() {
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
            ActivityCompat.requestPermissions(this, new String[] {
                Manifest.permission.ACCESS_FINE_LOCATION
            }, 1001);
        } else {
            ActivityCompat.requestPermissions(this, new String[] {
                Manifest.permission.ACCESS_FINE_LOCATION
            }, 1003);
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        }
        return false;
    } else
        return true;
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...