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()
,这可能是您现在正在做的事情。
我正在尝试设置权限,以便在自定义列表适配器 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()
,这可能是您现在正在做的事情。