코드네임 :
📱 모바일프로그래밍 - 콘텐트프로바이더 📱 본문
[콘텐트 프로바이더 CP]
: 안드로이드는 보안상 앱에서 사용하는 데이터를 외부에서 접근할 수 없는데,
: 이런 파일이나 데이터 베이스를 외부 앱에서 사용하도록 해주는 친구
- Intent와 무상관
[ 쿼리 작성하기 ] ⭐️
: query()는 콘텐트 프로바이더에서 데이터를 조회하는 메서드
: 데이터를 필터링, 정렬, 필요한 열만 반환 등 다양한 방식으로 검색할 수 있습니다.
: 반환값은 Cursor 객체로, 결과 데이터를 행 단위로 탐색할 수 있습니다.
Project10_3
통화기록을 가져오는 예제
MainActivity
(1) onCreate내부 (맨끝)
//ActivityCompat.requestPermissions: 특정 권한(여기서는 통화 기록 읽기 권한)을 런타임에 요청
//Manifest.permission.READ_CALL_LOG: 통화 기록 읽기 권한
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CALL_LOG},1);
//이거 Manifest 안드로이드로 시작하는거로 해야지 뒤에 리드 로그가 뜸. 안그럼 오류나긔
// 버튼 클릭 리스너
binding.btnCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//사용자가 btnCall 버튼을 클릭하면 getCallHistory() 메서드가 호출됨
//반환된 통화 기록 데이터를 edtCall 텍스트 뷰에 표시
binding.edtCall.setText(getCallHistory());
}
});
(2) onCreate 외부
// 전화기록 가져옴
public String getCallHistory() {
// callset은 쿼리를 통해 가져올 데이터 열을 정의
String[] callSet = new String[]{
CallLog.Calls.DATE, CallLog.Calls.TYPE,CallLog.Calls.NUMBER,
CallLog.Calls.DURATION};
// 쿼리 실행
// Cursor 객체 c는 쿼리 결과를 담는 데이터 구조
// CallLog.Calls.CONTENT_URI: 통화 기록 데이터베이스를 나타내는 URI
// callSet: 반환할 열의 목록
// null: 조건(selection), 조건 값(selectionArgs), 정렬 방식(sortOrder)이 없으므로 모든 데이터를 조회
Cursor c = getContentResolver().
query(CallLog.Calls.CONTENT_URI, callSet,
null, null, null);
//결과가 없을 때 처리
if (c ==null){ // 가 실패했거나 결과가 없는 경우
return "통화기록 없음"; //데이터가 없음을 사용자에게 알림
}
//문자열 버퍼 초기화
// 데이터를 효율적으로 추가/수정할 수 있는 문자열 클래스인 StringBuffer
// ^^ 여기에 통화기록을 추가함- > 마지막에 하나의 문자열로 반환
StringBuffer callBuff = new StringBuffer();
//데이터를 읽기 쉽게 "날짜: 구분: 전화번호: 통화시간" 형식의 헤더를 추가
callBuff.append("\n 날짜: 구분 : 전화번호 : 통화시간 \n\n");
c.moveToFirst(); //목록의 첫번쨰로 이동하여 (커서를 첫 번째 레코드로 이동) (통화 기록 데이터를 읽기 시작할 준비)
do { //무조건한번은 수행
long callDate = c.getLong(0); //첫 번째 열(CallLog.Calls.DATE)에서 통화 날짜 데이터를 가져와 callDate에 저장
//날짜:
//SimpleDateFormat을 사용해 yyyy-MM-dd 형식으로 변환.
SimpleDateFormat datePattern = new SimpleDateFormat("yyyy-MM-dd");
String date_str = datePattern.format(new Date(callDate));
//포맷팅된 날짜를 결과 문자열에 추가합니다
callBuff.append((date_str + ":"));
//출력 예: "2023-12-01:".
//통화 유형:
//c.getInt(1): 두 번째 열(CallLog.Calls.TYPE)에서 통화 유형 데이터를 가져옵
if (c.getInt(1) == CallLog.Calls.INCOMING_TYPE)
callBuff.append("착신 :");
else
callBuff.append("발신 :");
//전화번호와 통화 시간 처리:
//c.getString(2): 세 번째 열(CallLog.Calls.NUMBER)에서 전화번호 데이터를 가져옵
callBuff.append(c.getString(2)+":");
//c.getString(3): 네 번째 열(CallLog.Calls.DURATION)에서 통화 시간을 가져옵
callBuff.append(c.getString(3)+"초\n");
} while (c.moveToNext()); //c.moveToNext(): 다음 레코드로 커서를 이동, 더 이상 읽을 데이터가 없으면 루프 종료
c.close(); //커서를 닫아 리소스를 해제 (필수)
return callBuff.toString(); //모든 통화 기록을 포맷팅한 문자열을 반환
}
'👾Android > Android_JAVA' 카테고리의 다른 글
📱 모바일프로그래밍 - SQLite로 데이터 관리하기 📱 (1) | 2024.12.12 |
---|---|
📱 모바일프로그래밍 - 데이터 저장소 & 공유환경설정 파일로 데이터 관리하기 📱 (0) | 2024.12.08 |
📱 모바일프로그래밍 - 브로드캐스트 리시버 📱 (0) | 2024.12.07 |
📱 모바일프로그래밍 - 서비스 📱 (3) | 2024.12.07 |
📱 모바일프로그래밍 - 과제 2📱 (1) | 2024.12.02 |