본문 바로가기

Android/Java

권한요청하기

반응형

오늘은 권한 요청에 대해 삽질했던 내용과 요청 방법에 대해 써보겠습니다.


권한 요청 방법은 구글링 또는 디벨로퍼에 있는 것과 같습니다.


하지만 초보자인 제가 삽질한 부분은..........


자바로 코딩만 해놓고 "Manifest"에 선언을 하지 않아 왜 안되지 하며 시간을 버렸습니다.


선언 후 반드시, 매니페스트 파일에서 사용할 권한을 "꼭" 선언하시길 바랍니다.


저는 permissionUtil을 따로 만들어 사용했습니다.



1. permission check 및 전화번호부 가져오기

private static PermissionUtil instance;
public static PermissionUtil getInstance() {
if (instance == null)
instance = new PermissionUtil();

return instance;
}

private Activity context;
public void PermissionUtil(Activity context) {
this.context = context;
}

private DialogUtil dialogUtil;
public void showPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int permissionReadContactsResult = context.checkSelfPermission(Manifest.permission.READ_CONTACTS);
if (permissionReadContactsResult == PackageManager.PERMISSION_DENIED) {
/* 사용자가 한번이라도 거부한 적이 있는지 조사해 있다면 true 반환 */
if (context.shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)
&& context.shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)
&& context.shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS)) {


} else { /* 최초로 권한을 요청할 때 */
context.requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.READ_SMS, Manifest.permission.SEND_SMS}, 1000);
}
} else { /* 권한이 있을 때 */
getContacts();
}
} else {
getContacts();
}
}

private List<String> arrayListContactsName = new ArrayList<>();
private List<String> arrayListContactsPhone = new ArrayList<>();

private void getContacts() {
Cursor cursor = context.managedQuery(ContactsContract.Contacts.CONTENT_URI, new String[]{
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID
}, null, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");

if (!cursor.moveToNext()) {
intentFundActivity();
return;
}

while (cursor.moveToNext()) {
try {
String v_id = cursor.getString(0);
String v_display_name = cursor.getString(1);
String v_phone = contactsPhone(v_id);

arrayListContactsName.add(v_display_name);
arrayListContactsPhone.add(v_phone);
} catch (Exception e) {
System.out.println(e.toString());
}
}
cursor.close();
}

// 기계에서 핸드폰 번호 가져오기
private String contactsPhone(String p_id) {
String reuslt = null;

if (p_id == null || p_id.trim().equals("")) {
return reuslt;
}

Cursor cursor = context.managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + p_id,
null, null);
while (cursor.moveToNext()) {
try {
reuslt = cursor.getString(0);
} catch (Exception e) {
System.out.println(e.toString());
}
}
cursor.close();
return reuslt;
}


완전한 소스가 아닙니다! 참고하세요! 이건 깃에 따로 정리해서 올린 뒤 업데이트 하겠습니다.

이런식으로 전화번호부에 있는 명단을 가져올 수 있습니다.



2. sms보내기


public class SendSmsUtil {
private static SendSmsUtil instance;
public static SendSmsUtil getInstance() {
if(instance == null)
instance = new SendSmsUtil();

return instance;
}

public void sendSMS(final Activity context, String phoneNumber, String message) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
String strMessage = "인증번호 : " + message;

// 각각 위에서부터 문자 전송, 문자 수신에 관련하여 sendTextMessage()에 넘겨줄 값들입니다
PendingIntent senTPI = PendingIntent.getBroadcast(context, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(context, 0, new Intent(DELIVERED), 0);

//---when the SMS has been sent---
context.registerReceiver(new BroadcastReceiver() {
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "SMS 전송", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(context, "Generic failure", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(context, "No service", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(context, "Null PDU", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(context, "Radio off", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));

context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "SMS 전송 완료", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(context, "SMS 전송 실패", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, strMessage, senTPI, deliveredPI);
}
}


이런식으로 상대방의 전화번호와 메시지를 넘겨받아 android에서 sms를 보낼 수 있습니다.


건당 가격이 들어가는데, 얼마인지는 까먹었습니다....


<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />



이렇게 퍼미션을 넣어놓는거 잊지 마시고


이상 sms보내기와 전화번호부 명단 가져오기, permission check 방법에 대해 소개했습니다.





반응형

'Android > Java' 카테고리의 다른 글

간단한 SplashActivity 만들기  (0) 2018.05.09
ProgressbarUtil 만들기  (0) 2018.05.08
마켓에 올린 앱의 "버전" 가져오는 방법  (0) 2018.05.06
간단한 view pager 사용법  (0) 2018.05.03
sms보내기  (0) 2018.04.26