使用 Gluon 移动环境时如何在运行时请求权限?

2024-02-16

我是新来的,因此我还不知道该网站的所有规则,对此感到抱歉!

我正在使用 Eclipse 工具中的 Gluon 移动插件构建桌面和 Android 的 Java 应用程序。我有针对桌面和 Android 的不同代码,如示例中所述(http://docs.gluonhq.com/samples/gonative/ http://docs.gluonhq.com/samples/gonative/)。所以我有 Android 特定的 NativeService,我有一个从外部存储读取文件的方法(有效)。我还研究了如何在使用原生Android环境时请求运行时权限(Marshmallow 中的存储权限错误 https://stackoverflow.com/questions/33162152/storage-permission-error-in-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;
        }
    }
} 

对于初学者,您可以添加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()监听该活动的结束并在授予权限的情况下恢复呼叫。

以下代码部分基于权限助手类 https://github.com/mvglasow/satstat/blob/master/src/com/vonglasow/michael/satstat/utils/PermissionHelper.java.

我将使用新 Charm Down 3.0.0 中的 Dialer 服务的简单案例library https://bitbucket.org/gluon-oss/charm-down,这需要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" />
. . .   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Gluon 移动环境时如何在运行时请求权限? 的相关文章

  • 如何从一个活动中完成一系列开放的子活动?

    我正在尝试为我的应用程序制作一个退出按钮 无论如何 我能够跟踪我的应用程序中的所有活动实例 然后完成它们 但在某些情况下 仍有一些活动仍然存在 不知道怎么办 有没有什么方法可以杀死android中的特定应用程序 或者我可以通过任何其他方式退
  • Google Play 商店中基于服务的 Android 应用程序

    我正在开发一个应用程序 该应用程序仅包含一些服务 没有任何活动 即没有 UI 基本上 当用户在他 她的设备上安装应用程序时 我希望有 2 到 3 个服务在后台运行 对此我有几个疑问 应用程序安装后我的服务将如何启动 我的BroadcastR
  • 如何使用retrofit2进行GET请求?

    我有一个在本地主机上运行的安静的 Web 服务 我想在该剩余 URL 上发出 Retrofit2 GET 请求 MainActivity java private void requestData public static final S
  • Android Manifest 自动生成无效权限

    我不小心在 Android 清单中输入了无效的权限名称 并且无法将其删除 这是我的清单代码
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • 游标索引越界异常

    打开后出现光标索引越界错误 数据库 请任何人告诉我如何打开现有数据库 sqllite Android 我想在数据库上触发一个选择查询 检索一些信息 public void getPatient SQLiteDatabase db Strin
  • Android CursorAdapter、ListView 和后台线程

    我一直在开发的这个应用程序有包含数兆字节数据的数据库可供筛选 许多活动只是列表视图 通过数据库中的各个级别的数据下降 直到到达 文档 即从数据库中提取并显示在手机上的 HTML 我遇到的问题是 其中一些活动需要能够通过捕获击键并重新运行带有
  • 多语言 Android 应用程序:在电子邮件和密码字段中显示英文键盘

    我们正在开发一款多语言 Android 应用程序 针对英语和阿拉伯语 面临的问题是在登录和注册屏幕中 我们希望仅以英文文本输入用户名和密码字段 从而显示英文键盘 无论设备区域设置语言如何 已尝试在 edittext 中设置 inputtyp
  • Android 谷歌地图 V2 已停止

    我正在尝试构建地图应用程序并关注这个链接 https blog emildesign rhcloud com p 435一步步 我在这里找到了类似的主题 但对我没有帮助 我想显示地图 但是当我运行它时 它返回强制关闭和我的 Android
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • Ctrl + Space 不适用于 Eclipse 上的内容辅助

    我的问题是点击后不会弹出内容辅助窗口Ctrl Space 我检查了我的快捷方式 内容辅助必然会Ctrl Space 有时 例如在输入点后 窗口会自动弹出提出建议 但使用组合键时不会发生这种情况 日食版本 面向 Web 开发人员的 Eclip
  • 收到“无法解析上传的APK的AndroidManifest.xml。它是否正确编译?”启用 Google 应用签名后出现错误

    启用后谷歌应用程序签名 https support google com googleplay android developer answer 7384423 hl en 每次我尝试将签名版本 APK 上传到 Play 商店时 都会收到一
  • 截图显示黑色

    我正在拍摄快照并创建缩略图 然后共享此图像 但缩略图显示全黑 我使用了以下代码 Bitmap bitmap View v1 v getRootView v1 setDrawingCacheEnabled true bitmap Bitmap
  • 有没有办法在多个嵌套的 RecyclerView 之间共享同一个 LayoutManager

    我正在开发一个显示游戏列表的应用程序 在每个游戏的 itemView 内 我还有一个要显示的视频列表 预览和结构如下 我部署了一个RecyclerView作为窗口根视图 然后对于视频 我使用网格样式的RecyclerView来显示 所以这里
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • BitmapFactory.decodeResource() 忽略 jpg 图像的 inPreferredConfig 选项

    我尝试将jpeg资源图像加载到ARGB 8888格式的位图 BitmapFactory Options opts new BitmapFactory Options opts inPreferredConfig Bitmap Config
  • Android 4.2 - Environment.getExternalStorageDirectory().getPath() 行为

    我一直在开发一个android应用程序 在上次更新到4 2之前 我使用 Environment getExternalStorageDirectory getPath 它返回了我 storage sdcard0 但自从更新后我现在得到了 s
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports

随机推荐

  • 类型错误:mel() 接受 0 个位置参数,但给出了 5 个

    当我使用 Tacotron 培训笔记本时 我收到一条错误消息 说明了这一点 Traceback most recent call last
  • 您可以在枚举类中使用按位运算符而不进行强制转换吗?

    我喜欢使用枚举类 但有时我将它们用作标志 并且我必须不断地转换为int如果我想使用按位运算符 有没有办法在不铸造的情况下做到这一点 我认为您无法为它们定义运算符 如果我有采用枚举类的函数 我必须这样做吗 enum class Flags F
  • mysql(i)_real_escape_string,安全可靠吗?

    function Query args func get args if sizeof args gt 0 query args 0 for i 1 i lt sizeof args i query preg replace mysql r
  • 如何制作一个使用全局类型但不使用它来扩展项目的 NPM 包?

    问题 任何在许多不同文件中重用大量类型的项目都可以使用在脚本文件 这些类型在整个项目中全局可见 不需要导入 请参阅官方手册 https www typescriptlang org docs handbook modules html 在
  • 编辑 UI 的 task.Wait() 上出现死锁

    我试图在这里找到一些解决我的问题的方法 但没有结果 或者我只是没有得到正确的结果 所以如果有人可以帮助 解释我将非常感激 我正在使用 Win Form 为系统管理员开发一个工具 现在我需要在选定的后台运行的计算机上创建连续的 ping UI
  • 有没有办法改变散点图上的原点轴(零线)?

    有没有办法改变散点图上的轴 假设将轴从 0 0 即 零线 移动到 3 3 之类的位置并制作象限图 我尝试将 xaxis 和 yaxis 上的 zeroline 值设置为False 然后从 shapes 的两个轴上绘制两条常量线 但我想知道是
  • NodeJS MySQL 转储

    我尝试编写一个基本的 cron 脚本来运行和 转储 mysql 数据库 由于某种原因 当它 成功保存文件 时 它确实创建了该文件 但它是空的 如果我不保存文件 而是执行 console log 它会打印一个空字符串 对我可能做错了什么有什么
  • NSView 初始化:-init: 与 -awakeFromNib:

    我有一个简单的课程MyView继承自NSView和实例变量NSImage image 在里面 类的功能是在视图上绘制图像 然而 在 drawRect 图像实例始终相等nil 如果它是在 init 功能而不是nil如果它是在 awakeFro
  • 通过 TCP 传输程序集

    我目前正在尝试通过 TCP 连接发送序列化对象 如下所示 BinaryFormatter formatter new BinaryFormatter formatter Serialize clientStream Object Assem
  • 如何反汇编正在运行的linux内核?

    寻找一种反汇编正在运行的内核的方法 我可以通过 dev kmem 来实现吗 我运行的是linux 2 6 32 或者我可以使用内核模块来运行内核吗 我是初学者 请帮忙 我想做的就是通过查看是否出现某些特定指令来检查内核映像中是否存在某些恶意
  • MediaStyle 通知:播放/暂停按钮不响应单击

    在我的应用程序中 当用户选择要播放的音频文件时 当文件准备好并且播放开始时 会成功显示 MediaStyle 通知 元数据信息已更新 标题 图标等 但是 1 Play Pause button does not respond to cli
  • 在 PyCharm 中调试 asyncio 代码会导致绝对疯狂的不可重复错误

    在我的基于使用 PyCharm 调试器进行调试的 asyncio 和 asyncio tcp 连接的项目中 我遇到了非常非常荒谬的错误 如果我在运行后在代码上放置断点 则断点永远不会触发 但是如果在启动程序之前设置了断点 则会触发断点 但在
  • Select2 下拉更改事件不起作用

    我在用Select2下拉菜单 我需要根据下拉菜单选择执行一些功能 我尝试过以下代码 但它对我不起作用 eventSelect on select2 select function e log select2 select e eventSe
  • 结构体中的指针和值有什么区别?

    给定以下结构 type Exp struct foo int bar int 在结构中使用指针或值时 性能有何区别 是否有任何开销或者这只是 Go 编程的两个流派 我会使用指针来实现链式结构 但这是否是我们必须在结构中使用指针以获得性能的唯
  • jQuery - SlideToggle() 和切换文本

    我有一个可以使用隐藏的联系表 slideToggle 但我希望该选项卡用于Toggle根据表单是否更改文本的表单in view or hidden 这是 jQuery slider click function form wrap anim
  • 如何将 SQLSRV 扩展安装到 php XAMPP

    I m trying to install a SQLSRV extension My PHP version is 7 2 XAMPP 3 2 2 and I use windows 10 I downloaded the dll fro
  • myisam_sort_buffer_size 与 sort_buffer_size

    我的服务器是 MySQL 内存为 6GB 我需要知道 myisam sort buffer size 和 sort buffer size 之间有什么区别 我为它们设置了以下尺寸 myisam sort buffer size 8M 排序缓
  • 错误:找不到Python模块tensorflow.python.keras

    我想将一些数值转换为类别 我正在使用 keras 包进行图像分类 当我使用 to categorical trainy 时 收到 错误 未找到 Python 模块tensorflow python keras 我已经采取了 trainy l
  • Firebase - 对多个节点进行更新/扇出时设置优先级

    我正在一次更新中写入 Firebase 数据库的多个部分 节点 这样做时是否可以设置节点的优先级 例子 firebaseRef update some node value some other node other value 如果我想同
  • 使用 Gluon 移动环境时如何在运行时请求权限?

    我是新来的 因此我还不知道该网站的所有规则 对此感到抱歉 我正在使用 Eclipse 工具中的 Gluon 移动插件构建桌面和 Android 的 Java 应用程序 我有针对桌面和 Android 的不同代码 如示例中所述 http do