- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试同时请求来自多个来源的多个权限。我的问题是只请求了一个权限。
这是一个例子:
我们在 MainActivity 上同时加载了 2 个 fragment ,例如
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.myapplication.MainActivity"
android:orientation="vertical">
<fragment android:name="com.example.myapplication.fragments.FragmentOne"
android:id="@+id/fragment_one"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<fragment android:name="com.example.myapplication.fragments.FragmentTwo"
android:id="@+id/fragment_two"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
我们有请求 READ_CALL_LOG 的 FragmentOne,例如
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
requestPermissions(new String[]{Manifest.permission.READ_CALL_LOG}, 1);
}
我们还有请求 READ_CONTACTS 的 FragmentTwo,例如
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
requestPermissions(new String[] { Manifest.permission.READ_CONTACTS }, 2);
}
这意味着一旦应用程序启动,就会创建 2 个 fragment ,然后启动。当发生这种情况时,两个 fragment 同时请求许可。我的问题是只向用户提示第一个权限。
现在要弄清楚我的问题,我在每个 fragment 的 onRequestPermissionsResult 中添加了一些日志,例如
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult: requestCode=" + requestCode + " permissions=" + permissions
+ " permissions.length=" + permissions.length + " grantResults.length=" + grantResults.length);
for (String permission : permissions) {
Log.d(TAG, "onRequestPermissionsResult: permission=" + permission);
}
}
之后我发现了我的问题,但没有解决方案。当我查看日志时,一旦我启动应用程序,我就会得到这些日志
2017-05-02 13:22:40:0356 + 677 05-02 13:22:38.650 27003 27003 D FragmentOne: onStart:
2017-05-02 13:22:40:0357 + 699 05-02 13:22:38.661 27003 27003 D FragmentTwo: onStart:
2017-05-02 13:22:40:0357 + 702 05-02 13:22:38.661 27003 27003 D FragmentTwo: onRequestPermissionsResult: requestCode=2 permissions=[Ljava.lang.String;@afbcb45 permissions.length=0 grantResults.length=0
同时,显示请求 READ_CALL_LOG 的对话框。这里的问题似乎是它太早进入 onRequestPermissionsResult。
一旦我从对话框中接受了 READ_CALL_LOG 权限,我就会得到 2 个新日志
2017-05-02 13:27:42:0017 + 2803 05-02 13:27:40.358 27003 27003 D FragmentOne: onRequestPermissionsResult: requestCode=1 permissions=[Ljava.lang.String;@5028ba8 permissions.length=1 grantResults.length=1
2017-05-02 13:27:42:0017 + 2804 05-02 13:27:40.358 27003 27003 D FragmentOne: onRequestPermissionsResult: permission=android.permission.READ_CALL_LOG
此时,没有显示我期望的第二个权限对话框(用于 READ_CONTACTS)。不再生成日志。
现在,我知道我可以从不同的 fragment 中获取所有权限,并通过传递相关的字符串数组同时提示它们。但这不是我在这里想要完成的。我正在尝试让多个组件处理它们自己的权限。
我错过了什么吗?我做错了什么吗?
作为引用,我将把 MainActivity 和 FragmentOne 的完整代码放在这里。 FragmentTwo 几乎是一样的东西(只有 TAG 和权限发生了变化)。
主要 Activity :
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
fragment 一:
public class FragmentOne extends Fragment {
private static final String TAG = "FragmentOne";
public FragmentOne() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_fragment_one, container, false);
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
requestPermissions(new String[]{Manifest.permission.READ_CALL_LOG}, 1);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult: requestCode=" + requestCode + " permissions=" + permissions
+ " permissions.length=" + permissions.length + " grantResults.length=" + grantResults.length);
for (String permission : permissions) {
Log.d(TAG, "onRequestPermissionsResult: permission=" + permission);
}
}
}
最佳答案
尝试将权限请求放在 Activity 中而不是 fragment 中,并同时请求两者。问题似乎在于,当您请求第二个权限时,第一个对话框关闭,因此被视为被拒绝。
关于Android 处理来自不同来源的同时权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43744103/
我正在用 robocopy 编写一个 powershell 脚本来从列表中复制“完整的”unc/文件名路径。我遇到的问题是 robocopy 似乎在我的源路径末尾添加了一个 \。 我有一个 C:\te
我发现守护程序通过这些代码创建了一个容器 // NewBaseContainer creates a new container with its // basic configuration. fu
是否有所有潜在 map 源的列表?在示例页面上,可以浏览四种类型的 map 。外面还有什么? http://tombatossals.github.io/angular-leaflet-directi
是否有所有潜在 map 源的列表?在示例页面上,可以浏览四种类型的 map 。外面还有什么? http://tombatossals.github.io/angular-leaflet-directi
我们的网站比较多,第一次使用ElasticSearch不知道应该怎么配置ES: 我们想使用 ES 作为这些网站的唯一搜索引擎,我们是否应该为每个网站设置单独的 ES 实例? (我想这可能比一个 ES
我需要一些关于我对 UNI 项目的想法的建议。 我想知道是否可以将一个音频文件从不同的音频源分成不同的“流”。例如,将音频文件拆分为:引擎噪音、火车噪音、人声、并非始终存在的不同声音等。 我不一定需要
我想设置“公共(public)彩票”,每个人都可以看到选择是随机和公平的。如果我只需要一点,我会使用例如当天收盘道琼斯指数的 LSB。问题是,我需要 32 位。我需要一个来源: 每日可用 全世界都可以
来自 pickle 的 python 文档: Warning The pickle module is not secure. Only unpickle data you trust. 什么是 pi
我试图安排一个 liquidsoap 流媒体源在未来的特定日期和时间播放。我相信这可以使用 Liquidsoap switch 命令来完成,但我无法理解此处描述的文档:http://liquidsoa
对于Shiny应用程序,我希望能够播放在 session 本身期间生成的音频文件。 如果它是我要上传的音频文件,我将使用 tags$audio(src = "www/name.wav", ty
我想更改我的 OpenGL 来源。图片会说明: 现在是这样的: 这就是我想要的: 当前代码 gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL
我正在尝试让 Stripe 运行起来,我几乎已经完成了,但有一件令人困惑的事情。 source: 'tok_visa' 部分。看起来它可以是“tok_mastercard”、“bank_account
我已经下载了 primefaces 源代码,看看是否可以从中学习。该 jar 包含一堆使用编写器来处理渲染等的 java 类。我期待找到一些 .xhtml 文件 ... and etc etc
如果我查看页面源代码,我会看到 styling += 'ul#topnav a.tabHeader5'; styling += '{'
我正在尝试根据显示器的大小更改背景图像。它不在服务器上运行。您可以在 https://github.com/Umpalompa/Umpalompa.github.io 找到我的所有代码. 我尝试同时使
从here的最底部开始.有一个 URL 生成器,我可以使用引荐来源网址在 Google Play 上生成指向我的应用程序的链接。我如何从谷歌分析中提取该 Activity 来源?我一直在谷歌上搜索,但
我用 Google Weather API 制作了一个插件,目前我正在从 Google 的 API 中提取图像。对于晴天,我正在拉 http://www.google.com//ig/images/w
是否可以通过环境变量为 @CrossOrigin 注释指定来源?我想这样做,以便我可以将相同的代码库用于 uat/staging/production。我希望我的 uat/staging 环境可以通过
我需要等待我的 JavaScript 中的文档准备就绪,才能在正文底部插入一个 div。 我想: 使此 JavaScript 文件尽可能小(如果可能,将其编译到 < 1kb) 在闭包中内联提供文档就绪
我正在开发电子邮件服务并想连接到谷歌帐户,是否可以将我的本地主机用作授权的 JavaScript 来源? 最佳答案 第 1 步:启用 Google+ API http://localhost:4567
我是一名优秀的程序员,十分优秀!