我正在开发一个需要访问手机中联系人的应用程序。此方法在线程内执行。但是当应用程序第一次启动时它会崩溃,并说android.permission.READ_CONTACTS或android.permission.READ_CONTACTS需要作为错误。一旦按下确定错误弹出对话框。它重新启动它自我要求许可,并正常工作。在某些手机中,它没有显示任何错误或对话框。
这是onCreateView方法中片段内的代码,用于检查是否已经授予了权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
== PackageManager.PERMISSION_GRANTED) {
Runnable r = new Runnable() {
@Override
public void run() {
getContacts();
}
};
Thread thread = new Thread(r);
thread.start();
}else{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {
Toast.makeText(this, "Read contacts permission is required to function app correctly", Toast.LENGTH_LONG)
.show();
}
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
}
这是onRequestPermissionsResult方法。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case REQUEST_READ_CONTACTS :
Runnable r = new Runnable() {
@Override
public void run() {
getContacts();
}
};
Thread thread = new Thread(r);
thread.start();
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
这是AndroidManifest.xml代码。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shan.chathuranga.smsscheduler">
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest>
我做错了什么。在棉花糖下面工作正常。 requestPermissions
方法。
这是存储库https://chathurangaJ@bitbucket.org/chathurangaJ/sms-scheduler.git的链接 我被困在这里2周了,请帮忙。
我尝试调试它。一旦应用程序到达
,就会出现此错误答案 0 :(得分:0)
如果打开菜单并长按您的应用程序,然后显示选项1.app info和2.uninstall,只需将您的应用程序拖动到应用程序信息,然后您将看到存储和数据使用情况等..,然后查看权限选项打开并检查联系人权限是否存在,如果有联系人只是启用并运行您的应用程序,您将收到联系,或者您的代码可能有问题,如果您有任何权限详细信息,请检查以下链接, https://developer.android.com/training/permissions/requesting.html
答案 1 :(得分:0)
private boolean checkPermission(){
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_CONTACTS)) {
Toast.makeText(getActivity(), "Contact read permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getActivity().getPackageName(), null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, 789);
return false;
}else {
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 123);
return false;
}
}
return true;
}
使用此方法检查API级别23或更高级别的运行时权限, 如果用户允许,它会在运行时向您显示一个权限对话框,如果拒绝则一切正常,那么您必须再次检查权限以防止应用程序崩溃,
在使用此代码之前,请添加联系人阅读权限。 希望它会对你有所帮助。
注意
4.确保从活动的 onRequestPermissionsResult 中调用 super.onRequestPermissionsResult 。
答案 2 :(得分:0)
这是你的方法并且工作正常我已经检查过,请尝试使用 onCreateView 方法进行调用。
private void check(){
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS)
== PackageManager.PERMISSION_GRANTED) {
Runnable r = new Runnable() {
@Override
public void run() {
// getContacts();
}
};
Thread thread = new Thread(r);
thread.start();
}else{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {
Toast.makeText(getActivity(), "Read contacts permission is required to function app correctly", Toast.LENGTH_LONG).show();
}else {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.READ_CONTACTS},
1); }
}
}
}
并确保您已在 AndroidManifest.xml
中应用使用权限<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xyz">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
从以下地址致电:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_contact, container, false);
check();
return view;
}