Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 개인정보보호
- 곱셈 암호
- package.json
- 한국정보보호산업협회
- 호이스팅
- node.js
- 국가인적자원개발컨소시엄
- package-lock.json
- function scope
- 가명정보처리
- arrow function
- 확장 유클리드 알고리즘
- 유클리드_알고리즘
- 무료교육
- 개인정보보호교육
- 개인정보보호위원회
- 개인정보안전성
- 덧셈 암호
- 한국산업인력공단
- 한국정보보호산업협회기자단
- Writeup
- 마감임박
- 백엔드
- 디오판투스 알고리즘
- 웹 프레임워크
- 백엔드입문
- 포너블
- 동적타이핑
- 모듈러 연산
- pwnable.tw
Archives
- Today
- Total
짱짱해커가 되고 싶은 나
14-3. 콘텐트 프로바이더 본문
안드로이드 보안상 앱에서 사용하는 데이터를 외부에서 접근할 수 없다.
그래서 파일이나 데이터페이스를 외부 앱에서 사용하게 하려면 콘텐트 프로바이더(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으로 변경했다.

'모바일' 카테고리의 다른 글
| [안드로이드 취약점 진단] 1-2. 안드로이드 애플리케이션 구성요소 (0) | 2022.06.07 |
|---|---|
| [안드로이드 취약점 진단] 1-1. 안드로이드 아키텍처 (0) | 2022.06.07 |
| 14-2. 브로드캐스트 리시버 (0) | 2021.02.27 |
| 14-1. 서비스 (0) | 2021.02.27 |
| 13-3. 구글 지도 (0) | 2021.02.27 |
Comments