Android에서 새로운 기능이며 런타임 권한에 문제가 있습니다. 내 응용 프로그램은 전화의 모든 연락처를 읽고 목록에서 추출합니다. 문제는 내 휴대 전화의 연락처를 읽을 수있는 권한입니다. 지금까지 처음으로 앱을 열면 앱이 다운 된 다음 연락처를 읽을 수있는 권한을 요청합니다. 다시 열면 두 번째로 내 앱에 문제가 있습니다. 그래서 문제가 충돌하기 전에 허가를 요청하는 것입니다 ... 내 MainActivity는 다음과 같습니다Android Nougat 런타임 권한
<uses-permission android:name="android.permission.READ_CONTACTS" />
어떤 생각을 추가 물론
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_ASK_PERMISSIONS = 123;
ReadContacts values = new ReadContacts();
@Override
protected void onCreate(Bundle savedInstanceState) {
// Readcontacts val = new Readcontacts();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get ListView object from xml
/*
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS); }*/
final ListView listView = (ListView) findViewById(R.id.list);
final int frth = listView.getHeight();
ToggleButton toggle = (ToggleButton) findViewById(R.id.toggleButton9);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
for (int i = 0; i < listView.getChildCount(); i++) {
double max = 2 * 90;
Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 72, r.getDisplayMetrics());
listView.getChildAt(i).setMinimumHeight((int) px);
}
// The toggle is enabled
} else {
// The toggle is disabled
for (int i = 0; i < listView.getChildCount(); i++) {
listView.getChildAt(i).setMinimumHeight(frth);
}
}
}
});
String[] values = new String[1000000];
int temp =0 ;
final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 225);
//After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method
} else {
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (phones.moveToNext()) {
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
values[temp] = name;
temp += 1;
}
phones.close();}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.row, R.id.text, values);
listView.setAdapter(adapter);
// Assign adapter to ListView
listView.setAdapter(adapter);
// ListView Item Click Listener
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// ListView Clicked item index
int itemPosition = position;
// ListView Clicked item value
String itemValue = (String) listView.getItemAtPosition(position);
// Show Alert
Toast.makeText(getApplicationContext(),
itemValue, Toast.LENGTH_LONG)
.show();
}
});
}
}
나는 이미 내 매니페스트 변경 ???
편집 : 내 새 MainACtivity,하지만 내 문제는 여전히 있습니다 ... 어떤 아이디어?
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE_ASK_PERMISSIONS = 123;
ReadContacts values = new ReadContacts();
@Override
protected void onCreate(Bundle savedInstanceState) {
// Readcontacts val = new Readcontacts();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get ListView object from xml
// Here, thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS);
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CONTACTS)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
/*
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS); }*/
final ListView listView = (ListView) findViewById(R.id.list);
final int frth = listView.getHeight();
ToggleButton toggle = (ToggleButton) findViewById(R.id.toggleButton9);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
for (int i = 0; i < listView.getChildCount(); i++) {
double max = 2 * 90;
Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 72, r.getDisplayMetrics());
listView.getChildAt(i).setMinimumHeight((int) px);
}
// The toggle is enabled
} else {
// The toggle is disabled
for (int i = 0; i < listView.getChildCount(); i++) {
listView.getChildAt(i).setMinimumHeight(frth);
}
}
}
});
String[] values = new String[1000000];
int temp =0 ;
//final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
// requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
// ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 225);
//After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method
//} else {
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (phones.moveToNext()) {
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
values[temp] = name;
temp += 1;
}
phones.close();//}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.row, R.id.text, values);
listView.setAdapter(adapter);
// Assign adapter to ListView
listView.setAdapter(adapter);
// ListView Item Click Listener
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// ListView Clicked item index
int itemPosition = position;
// ListView Clicked item value
String itemValue = (String) listView.getItemAtPosition(position);
// Show Alert
Toast.makeText(getApplicationContext(),
itemValue, Toast.LENGTH_LONG)
.show();
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
}
오류가 안드로이드 6.0 (API 레벨 23) 년부터
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.serepasf.myapp4/com.example.serepasf.myapp4.MainActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{c638436 27660:com.example.serepasf.myapp4/u0a756} (pid=27660, uid=10756) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
어느 선에서 충돌이다 : 나는 시도 https://developer.android.com/training/permissions/requesting.html
샘플 코드 :
이또한 공식 문서를 확인할 수 있습니까? 예외는 무엇입니까? 오류 로그를 게시하십시오. –
충돌 로그를 게시하십시오. 또한 콜백 메소드'onRequestPermissionsResult (int, String [], int []) '의 구현을 보지 못했습니다. –
여러분의 허락은'onRequestPermissionsResult'입니까? – MohammedAlSafwan