onRequestPermissionsResult needs AppCompatActivity inheritance

 

and READ_CONTACT_CODE needs definition so if you don't want new definition then you can put 1 instead of that.

 

==========================================

public class MainActivity extends AppCompatActivity {
TextView mResult;
final int READ_CONTACT_CODE = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResult=(TextView)findViewById(R.id.result);
}

public void mOnClick(View v)
{
switch (v.getId()){
case R.id.btnread:
tryOutContact();
break;
case R.id.btnreset:
mResult.setText("내 주소록");
break;
}
}
void tryOutContact(){
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)== PackageManager.PERMISSION_GRANTED){
outContact();
}
else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACT_CODE);
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch (requestCode) {
case 1:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission is granted. Continue the action or workflow
// in your app.
outContact();
} else {
// Explain to the user that the feature is unavailable because
// the features requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
}
return;
}
// Other 'case' lines to check for other
// permissions this app might request.
}

void outContact(){
ContentResolver cr=getContentResolver();
Cursor cusor = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
int nameidx = cusor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);

if (cusor.moveToNext()){
mResult.setText(cusor.getString(nameidx));
}else {
mResult.setText("주소록이 비어있습니다.");
}
cusor.close();
}
}

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<Button
android:id="@+id/btnread"
android:layout_width="269dp"
android:layout_height="58dp"
android:layout_marginTop="76dp"
android:text="주소록 읽기"
android:onClick="mOnClick"
app:layout_constraintBottom_toTopOf="@+id/btnreset"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/btnreset"
android:layout_width="267dp"
android:layout_height="55dp"
android:layout_marginBottom="76dp"
android:text="리셋"
android:onClick="mOnClick"
app:layout_constraintBottom_toTopOf="@+id/result"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<TextView
android:id="@+id/result"
android:layout_width="244dp"
android:layout_height="61dp"
android:layout_marginBottom="128dp"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

+ Recent posts