如何为应用程序清单授予权限?如何在Android上以编程方式实现?

5

我使用了这个主题

我尝试了这段代码,但它没有起作用:

PACKAGE_NAME = context.getApplicationContext().getPackageName();

try {
  pi = context.getPackageManager().getPackageInfo(PACKAGE_NAME, PackageManager.GET_PERMISSIONS);
  for (String perm : pi.requestedPermissions) {
    Log.e("Foo", perm);
  }
} catch (Exception e) {
}

但它不能帮助我。我有应用程序列表,我想获取每个应用程序使用的权限。 我该如何处理?

更新: 就像这张照片,当点击“دسترسی ها”时,我想要获取在该应用程序中使用的权限。(例如在Telegram中:互联网、存储、呼叫、相机...)

enter image description here

更新2:

我将分享我的问题适配器代码。

我的适配器:

class AppViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {



    AppViewHolder(View itemView, Context context, List<App> apps) {
      super(itemView);
      txt_show_permission = itemView.findViewById(R.id.txt_show_permission);



      /*The String Buffer For Permissions*/
      appNameAndPermissions = new StringBuffer();
      PackageManager pm = context.getPackageManager();
      List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
      for (ApplicationInfo applicationInfo : packages) {
        Log.d(TAG, "App: " + applicationInfo.name + " Package: " + applicationInfo.packageName);

        PackageInfo packageInfo = null;
        try {
          packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_PERMISSIONS);
          appNameAndPermissions.append(packageInfo.packageName + "*******:\n");


          //Get Permissions
          requestedPermissions = packageInfo.requestedPermissions;

          if (requestedPermissions != null) {
            for (int i = 0; i < requestedPermissions.length; i++) {
              Log.d(TAG, requestedPermissions[i]);
              appNameAndPermissions.append(requestedPermissions[i] + "\n");
            }

            appNameAndPermissions.append("\n");
          }

        } catch (PackageManager.NameNotFoundException e) {
          e.printStackTrace();
        }


      }
    }

在onBindViewHolder中为txt_show_permission设置点击监听器:

holder.txt_show_permission.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

        showDialog(String.valueOf(appNameAndPermissions));

      }
    });

适配器类中的对话框方法:
 public void showDialog(String txtPermission) {
    final Dialog dialog = new Dialog(context);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setCancelable(false);
    dialog.setContentView(R.layout.show_permission_dialog);

    TextView txt_permission = dialog.findViewById(R.id.txt_permission);
    Button btn_ok = dialog.findViewById(R.id.btn_ok);
    txt_permission.setText(txtPermission);

    btn_ok.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        dialog.dismiss();
      }
    });
    dialog.show();

  }

1
从你的问题中并不清楚问题所在。获取应用程序在其清单中列出的所有权限列表很容易。那么问题是你无法获取所有已安装应用程序的列表吗?(“我可以获取应用程序包名称”似乎与此相矛盾)。此外,请合理地编写您的问题;不要随机大写字母(当尝试阅读文本时,这会非常分散注意力)。 - Michael
好的,我编辑一下...我想要获取我点击的每个应用程序的权限。 - Sana Ebadi
请查看更新的问题。我添加了照片。 - Sana Ebadi
为了让您的代码工作,您需要一个名为com.example.foo的应用程序。例如,要获取Telegram的权限,您需要在那里编写org.telegram.me,您需要为每个应用程序编写此内容。 - Kunj Mehta
是的,我理解了,但我不会用它。如何使用它?我想要一个字符串,请看更新。 - Sana Ebadi
显示剩余2条评论
1个回答

3
  1. 您可以遍历所有应用程序名称并获取其权限,并将它们存储在字符串缓冲区中,如下所示:https://dev59.com/K2435IYBdhLWcg3wfQJ9#14672557

  2. 或者,由于您希望在按钮单击时显示权限,因此您可以为每个应用程序添加代码,并使用适当的应用程序名称在OnButtonClickListener中。

  3. 或者,您可以每次单击按钮时从先前制作的StringBuffer中提取相关权限。

编辑:请参阅以下链接以了解如何为RecyclerView创建OnItemClickListener。您可以获取被点击行的位置,通过该位置获取该行中的应用程序名称,然后将其传递给另一个函数。然后,在该函数内编写代码以获取传递的应用程序名称的权限并显示它。 https://antonioleiva.com/recyclerview-listener/

https://hackernoon.com/android-recyclerview-onitemclicklistener-getadapterposition-a-better-way-3c789baab4db

https://gist.github.com/riyazMuhammad/1c7b1f9fa3065aa5a46f

编辑2: 不要将包含整个列表的appNameAndPermissions传递给showDialog,而是需要从字符串缓冲区中提取特定应用程序的权限。方法如下:

     String app_name = itemView.findViewById(R.id.app_name_text_view).getText().toString();
int indexOfApp = appNameAndPermissions.indexOf(app_name);
int indexOfLastPermission = appNameAndPermissions.indexOf("\n", indexOfApp);
String permissions = appNameAndPermissions.substring(indexOfApp, indexOfLastPermission);

1
你遇到了什么错误?我测试过了,即使没有GET_TASKS权限,StringBuffer部分也可以正常工作。你需要帮忙转换为字符串吗? - Kunj Mehta
1
你是如何实现上述布局的?你使用了ListView或其他View,还是一个一个地添加按钮和图像?我会相应地分享代码。 - Kunj Mehta
你看到我帖子里的照片了吗?我有一个像照片一样的RecyclerView,当点击名为“بررسی”的textView时,我想要显示该应用程序的权限对话框或toast,这没有问题,我只是想要像我说的那样获取应用程序权限。 - Sana Ebadi
1
在Github或网络上搜索RecyclerView的itemClickListeners,您将获得许多实现。使用任何一个即可。这样就不需要StringBuffer了。 - Kunj Mehta
1
首先,我假设txt_show_permission是您的按钮。其次,您需要确保在onBindViewHolder中设置setOnClickListener,而不是在创建适配器实例的位置。第三,您将不得不循环遍历requestedPermissions数组。第四,我会感激您分享所有相关代码,以便我可以理解上下文、流程和变量名称。 - Kunj Mehta
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接