짱짱해커가 되고 싶은 나

14-3. 콘텐트 프로바이더 본문

모바일

14-3. 콘텐트 프로바이더

동로시 2021. 2. 27. 21:55

안드로이드 보안상 앱에서 사용하는 데이터를 외부에서 접근할 수 없다.

그래서 파일이나 데이터페이스를 외부 앱에서 사용하게 하려면 콘텐트 프로바이더(CP)를 만들어서 외부로 제공해야한다.

콘텐트 프로바이더는 주로 URI를 이용해 데이터를 주고 받는다.

 

안드로이드에서는 자체적으로 몇가지 콘텐트 프로바이더를 제공한다.

ex) 연락처 전화번호, 통화 기록, 주소록, 브라우저의 북마크

 

 

ex) 안드로이드에서 통화 기록 가져오기

우선, mainfest에 CALL_LOG 읽기 권한을 줘야한다.

<uses-permission android:name="android.permission.READ_CALL_LOG"/>

 

<MainActivity.java>

package com.example.project14_2;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    Button btn;
    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_CALL_LOG}, MODE_PRIVATE);

        btn = (Button)findViewById(R.id.btn);
        editText = (EditText)findViewById(R.id.editText);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editText.setText(getCallHistory());
            }
        });
    }

    public String getCallHistory(){
        String[] callSet = new String[]{
                CallLog.Calls.DATE, CallLog.Calls.TYPE, CallLog.Calls.NUMBER, CallLog.Calls.DURATION};
        Cursor c = getContentResolver().query(CallLog.Calls.CONTENT_URI, callSet,
                null, null, null);
        if(c.getCount() == 0){
            return "통화기록 없음";
        }
        StringBuffer callBuff = new StringBuffer();
        callBuff.append("\n날짜 : 구분 : 전화번호 : 통화시간 \n\n");
        c.moveToFirst();
        do{
            long callData = c.getLong(0);
            SimpleDateFormat datePattern = new SimpleDateFormat("yyyy-MM-dd");
            String date_str = datePattern.format(new Date(callData));
            callBuff.append(date_str + ":");
            if(c.getInt(1) == CallLog.Calls.INCOMING_TYPE)
                callBuff.append("착신 :");
            else
                callBuff.append("발신 :");
            callBuff.append(c.getString(2) + ":");
            callBuff.append(c.getString(3) + "초\n");
        }while(c.moveToNext());

        c.close();
        return callBuff.toString();
    }
}

통화기록을 반환하는 getCallHistory 함수를 만들었다.

통화기록 중 Date, Type, Number, Duration 을 가져올 것이다.

getContentResolver() 는 getContentResolver를 반환하며 query(), insert(), delete(), update()로 CP의 데이터에 접근하고 변경할 수 있다. query()로 필요한 정보를 가져와서 cursor에 저장했다.

cursor 에 아무것도 없는걸 null로 하려고 했는데 null 아니었다 그래서 count == 0으로 변경했다.

 

Comments