Android 在列表视图自定义 apdpater 中设置权限 class

Android set permission inside list-view custom apdpater class

我正在尝试设置权限,以便在自定义列表适配器 class 中调用 phone 从 BaseAdapter 扩展自 getView 方法。

但是当触摸图标图像时应用程序崩溃

public View getView(int position, View convertView, ViewGroup parent) {


        final TextView  phoneTxt  = (TextView)convertView.findViewById(R.id.phone);
        ImageView phoneImage = (ImageView)convertView.findViewById(R.id.phone_icon);
        phoneImage.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
               int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE);
               if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CALL_PHONE}, REQUEST__PHONE_CALL);
               }
               else {
                 Intent intent = new Intent(Intent.ACTION_CALL);
                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                 intent.setData(Uri.parse("tel:" + phoneTxt.getText()));
                 context.startActivity(intent);
               }

        }
    });
    }


    return convertView;
}

这是错误日志

11-13 11:54:05.297: E/AndroidRuntime(9530): FATAL EXCEPTION: main
11-13 11:54:05.297: E/AndroidRuntime(9530): Process: com.myapp.myApp, PID: 9530
11-13 11:54:05.297: E/AndroidRuntime(9530): java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity
11-13 11:54:05.297: E/AndroidRuntime(9530):     at com.myapp.myApp.adapter.NavDrawerListAdapter.onClick(NavDrawerListAdapter.java:134)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at android.view.View.performClick(View.java:5269)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at android.view.View$PerformClick.run(View.java:21556)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at android.os.Handler.handleCallback(Handler.java:815)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at android.os.Handler.dispatchMessage(Handler.java:104)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at android.os.Looper.loop(Looper.java:207)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at android.app.ActivityThread.main(ActivityThread.java:5769)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at java.lang.reflect.Method.invoke(Native Method)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
11-13 11:54:05.297: E/AndroidRuntime(9530):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

为什么会这样,上面的代码有没有错误?

在您的代码中,您试图将上下文转换为 Activity,但 Context 不一定是 Activity 的实例。您可能使用 getApplicationContext()getApplication() 作为需要 Context 的参数。考虑使用 YourActivity.this 以便它可以转换为 Activity.

或者您可以使用我的库轻松地从任何上下文请求权限

查看 https://github.com/nabinbhandari/Android-Permissions

中的说明

例如

Permissions.check(context, Manifest.permission.CALL_PHONE, null,
    new PermissionHandler() {
        @Override
        public void onGranted() {
            //do your task.
        }
    });

在您的 activity 或 fargment

中声明全局
private static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 101;

创建 checkAndRequestPermissions 方法并在您的列表中或列表之前调用。

public static boolean checkAndRequestPermissions(Context context) {

    int callphonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE);

    List<String> listPermissionsNeeded = new ArrayList<>();

    if (callphonePermission != PackageManager.PERMISSION_GRANTED) {
       listPermissionsNeeded.add(Manifest.permission.CALL_PHONE);
    }

    if (!listPermissionsNeeded.isEmpty()) {
       ActivityCompat.requestPermissions((Activity) context, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
       return false;
    }
    return true;
}

看起来像你在这里使用的context

ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CALL_PHONE}, REQUEST__PHONE_CALL)
                                             ^^^^^^^

ApplicationContext 而不是 Activity 的上下文,无论您将上下文传递给适配器,都请尝试传递 :

YourActivity.this; // in case your list view is in an activity
getActivity(); // in case it's in a fragment

而不是 getApplicationContext(),这可能是您现在正在做的事情。