Как запросить разрешения во время выполнения при использовании мобильной среды Gluon?

Я здесь новенький, поэтому я еще не знаю всех правил сайта, извините!

Я создаю приложение Java для настольных компьютеров и Android, используя мобильный плагин Gluon в инструменте Eclipse. Я изменил код для ПК и Android, как описано в примере (http://docs.gluonhq.com/samples/gonative/). Итак, у меня есть специальный NativeService для Android, где у меня есть метод чтения файлов из внешнего хранилища (который работает). Я также изучил, как запрашивать разрешения во время выполнения при использовании собственной среды Android (Ошибка разрешения хранилища в Marshmallow). Я могу запросить разрешение, но не могу уловить результат.

Теперь я запрашиваю разрешения таким же образом, но как я могу получить результаты? Я не могу переопределить onRequestPermissionsResult, как в примере, потому что у меня нет напрямую доступных материалов android.support.v4.app. Может ли кто-нибудь помочь мне и привести пример?

AndroidNativeService.java:

package com.tentaattorix;

import java.io.IOException;

import java.io.File;
import android.os.Environment;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.content.Context;
import javafxports.android.FXActivity;
import android.util.Log;
import android.widget.Toast;
import android.content.pm.PackageManager;
import android.os.Build;
import com.avustajat.LueJaKirjoita;

/**
 * Sanaston luku: Android-natiivi toteutus!
 * @author PT
 * @version 24.10.2016
 *
 */
public class AndroidNativeService implements NativeService {

    private static final String TAG = "Tentaattorix Native Service";
    private Sanastot sanastot = new Sanastot();

    private static final int MY_PERMISSIONS_USE_EXTERNAL_STORAGE = 1;
    public AndroidNativeService() {
        //
    }

    @Override
    public Sanastot haeSanastot(String juuriKansio, String sanastoRegex, char kommentti, char erotin) throws IOException {


        String polku = Environment.getExternalStorageDirectory().toString();
        String readme = "LueMinut.txt";
        String kansioPolku ="";

        //Luodaan kansio, jos sitä ei vielä ole.
        File kansio = new File(polku, juuriKansio);
        kansio.mkdir();

        //Asetetaan oikeudet, jos vaikka auttais skannaukseen.
        kansio.setWritable(true);
        kansio.setReadable(true);
        kansio.setExecutable(true);
        kansioPolku = kansio.getAbsolutePath();


        //Kysy oikeudet, jos niitä ei ole!                                       
        if (isStoragePermissionGranted()) {

            //Luodaan kansioon tiedosto LueMinut.txt.
            try {
                LueJaKirjoita.luoLueMinut(kansioPolku, readme);
            }
            catch (IOException e){
                throw e;
            }

            //Informoidaan uudesta kansiosta ja sinne tulevista tiedostoista järjestelmää!
            scanFile(kansioPolku + File.separator + readme);


            //Luetaan sanastot kansiosta.
            sanastot = LueJaKirjoita.lueTiedostot(kansioPolku, sanastoRegex, kommentti, erotin);

        }

        // Jos sanastot ei sisällä yhtään sanastoa, 
        // niin laitetaan edes yksi :) 
        if (sanastot.annaLkm() < 1) {
            String[] rivix = {"Tyhjä sanasto!", "Empty glossary!"};
            Sanasto san = new Sanasto("sanasto_");
            san.lisaa(rivix);
            sanastot.lisaa(san);
        }
        return sanastot;
    }

    /**
     * //Informoidaan uudesta kansiosta ja sinne tulevista tiedostoista järjestelmää!
     * @param path lisätty polku+tiedosto
     */
    private void scanFile(String path) {

        MediaScannerConnection.scanFile(FXActivity.getInstance().getApplicationContext(),
                new String[] { path }, null,
                new MediaScannerConnection.OnScanCompletedListener() {

            public void onScanCompleted(String path, Uri uri) {
                Log.i("TAG", "Finished scanning " + path);
            }
        });
    }

    private  boolean isStoragePermissionGranted() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (FXActivity.getInstance().checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                Log.v(TAG,"Permission is granted");
                return true;
            } else {

                Log.v(TAG,"Permission is revoked");
                FXActivity.getInstance().requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_USE_EXTERNAL_STORAGE);
                return false;
            }
        }
        else { //permission is automatically granted on sdk<23 upon installation
            Log.v(TAG,"Permission is granted");
            return true;
        }
    }
} 

person Petrov Tusanoff    schedule 28.10.2016    source источник


Ответы (1)


Для начала вы можете добавить android-support-v4.jar в свой проект:

Скопируйте его из папки ANDROID_HOME / extras / android / support / v4 / android-support-v4.jar в папку libs в вашем проекте, а затем добавьте зависимость в файл build.gradle:

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

Предполагая, что вы ориентируетесь на Android SDK 23+:

    android {
        minSdkVersion '23'
        compileSdkVersion '23'
        targetSdkVersion '23'
        manifest = 'src/android/AndroidManifest.xml'
    }

тогда вы знаете, что по умолчанию все разрешения, включенные в манифест, будут отключены.

Если вы хотите проверить разрешения во время выполнения, вы можете определить новое действие, которое позаботится о запросе разрешений с помощью встроенного диалогового окна (с использованием ActivityCompat.requestPermissions), зарегистрировать это действие в манифесте и вызвать его из FXActivity в новом намерении который передает список с необходимыми разрешениями.

Вам просто нужно позвонить FXActivity.getInstance().setOnActivityResultHandler(), чтобы прослушать конец этого действия и возобновить вызов, если разрешения были предоставлены.

Следующий код частично основан на Класс PermissionHelper.

Я воспользуюсь простым случаем службы Dialer из новой библиотеки Charm Down 3.0.0, для этого требуется Manifest.permission.CALL_PHONE.

AndroidDialerService.java в пакете Android

public class AndroidDialerAskService implements DialerAskService {

    public static final String KEY_PERMISSIONS = "permissions";
    public static final String KEY_GRANT_RESULTS = "grantResults";
    public static final String KEY_REQUEST_CODE = "requestCode";

    @Override
    public void call(String number) {
        if (Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(FXActivity.getInstance(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                FXActivity.getInstance().setOnActivityResultHandler((requestCode, resultCode, data) -> {
                    if (requestCode == 11112) {
                        // if now we have permission, resume call
                        if (ContextCompat.checkSelfPermission(FXActivity.getInstance(), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                            call(number);
                        }
                    }
                });

                Intent permIntent = new Intent(FXActivity.getInstance(), PermissionRequestActivity.class);
                permIntent.putExtra(KEY_PERMISSIONS, new String[]{Manifest.permission.CALL_PHONE});
                permIntent.putExtra(KEY_REQUEST_CODE, 11111);
                FXActivity.getInstance().startActivityForResult(permIntent, 11112);
                return;
            }
        }

        if (number != null && !number.isEmpty()) {
            Uri uriNumber = Uri.parse("tel:" + number);
            Intent dial = new Intent(Intent.ACTION_CALL, uriNumber);
            FXActivity.getInstance().startActivity(dial);
        }
    }

    public static class PermissionRequestActivity extends Activity {
        private String[] permissions;
        private int requestCode;

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

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

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

AndroidManifest.xml

. . .
<uses-permission android:name="android.permission.CALL_PHONE"/>
. . .
<activity android:name="javafxports.android.FXActivity" .../>
<activity android:name="com.gluonhq.charm.down.plugins.android.AndroidDialerService$PermissionRequestActivity" />
. . .   

person José Pereda    schedule 01.11.2016
comment
что означает 11112 в AndroidDialerService.java? @JosePereda - person guru_007; 11.07.2017
comment
@ guru_007 Это просто случайный requestCode, который передается в startActivityForResult(Intent intent, int requestCode), чтобы убедиться, что setOnActivityResultHandler выполняется только для намерения с этим кодом. - person José Pereda; 11.07.2017
comment
Понятно ! @ Хосе Переда! - person guru_007; 11.07.2017
comment
FXActivity.getInstance().setOnActivityResultHandler((requestCode, resultCode, data) -> { //statement }); недоступен @Jose Pereda - person guru_007; 19.08.2017
comment
@ guru_007 Что значит недоступен? Вы используете недавний плагин jfxmobile? - person José Pereda; 20.08.2017
comment
classpath 'org.javafxports:jfxmobile-plugin:1.3.5 включен, когда я использую эту FXActivity.getInstance().setOnActivityResultHandler((request‌​Code, resultCode, data) -> { //statement }); моя IDE выдает ошибку, что этот метод недоступен. - person guru_007; 23.08.2017
comment
Тогда это проблема IDE. Если вы запустите из командной строки ./gradlew android, он будет работать. В вашей IDE (Eclipse?) Убедитесь, что вы добавили jfxdvk.jar в качестве зависимости. - person José Pereda; 23.08.2017