gpt4 book ai didi

Android 处理来自不同来源的同时权限

转载 作者:太空狗 更新时间:2023-10-29 14:43:35 25 4
gpt4 key购买 nike

我正在尝试同时请求来自多个来源的多个权限。我的问题是只请求了一个权限。

这是一个例子:

我们在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com