코드네임 :

📱 모바일프로그래밍 - 콘텐트프로바이더 📱 본문

👾Android/Android_JAVA

📱 모바일프로그래밍 - 콘텐트프로바이더 📱

비엔 Vien 2024. 12. 8. 03:25

[콘텐트 프로바이더 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(); //모든 통화 기록을 포맷팅한 문자열을 반환
    }