안드로이드에서 CAD, PDF 등의 파일 보기

안드로이드 디바이스에 저장된 CAD나 PDF 등과 같은 파일을 볼 수 있는 손쉽고 강력하며 안정적인 방법은 각각 파일을 볼 수 있는 책임성이 뛰어난 앱을 활용하는 것이라 할 수 있습니다. 예를 들어서 CAD 파일을 볼 수 있는 앱은 CAD 파일을 개발한 AutoDesk사의 AutoCAD 360이나 AutoDwg사의 DWGSee가 있으며 PDF 파일을 볼 수 있는 앱은 PDF 파일을 개발한 Adobe사의 Adobe Reader가 있습니다.

개발사가 업무용 프로그램을 개발하면서 경험하게 되는 요구사항은 고객이 가지고 있는 데이터 파일을 볼 수 있게 해달라는 것인데, GIS 분야에서는 DWG나 DXF와 같은 CAD 파일과 일반 문서인 PDF 파일이 바로 이러한 요구사항에 해당되는 데이터 파일이라고 할 수 있겠습니다.

이러한 데이터 파일을 별도의 앱과 연동하여 볼 수 있는 샘플 프로그램을 만들어 정리해 봅니다. 화면상에 2개의 버튼을 배치하고 첫번째 버튼을 터치하면 CAD 파일을 보고 두번째 버튼을 터치하면 PDF 파일을 볼 수 있도록 하겠습니다. 아래는 이러한 버튼의 배치 화면입니다.

사용자 삽입 이미지

첫번째 버튼인 CAD File View의 터치 이벤트에서 호출되는 함수입니다.

Intent intent = new Intent(Intent.ACTION_DEFAULT);
File file = new File("/sdcard/mapdata/dwg/samples.dwg");
if(file.exists()) {
    Uri uri = Uri.fromFile(file);
    intent.setData(uri);
    startActivity(intent);
}

이 버튼을 터치하면 아래의 화면 예처럼 지정된 파일을 볼 수 있습니다.

사용자 삽입 이미지

다음은 두번째 버튼인 PDF File View의 터치 이벤트에서 호출되는 함수입니다.

intent = new Intent(Intent.ACTION_DEFAULT);
File file = new File("/sdcard/e10842.pdf");
if(file.exists()) {
    Uri uri = Uri.fromFile(file);
    intent.setData(uri);
    startActivity(intent);
}

이 버튼을 터치하면 아래의 화면 예처럼 지정된 파일을 볼 수 있습니다.

사용자 삽입 이미지

안드로이드에서 이러한 프로그램들의(정확히는 Activity 간의) 연동은 매우 자연스러우며 매우 빠르게 실행됩니다. 그리고 다시 원래의 프로그램으로 자연스럽고 신속하게 복귀되어 마치 하나의 프로그램처럼 연동됩니다.

비록 간단한 내용이지만 고객의 요구사항에 대해서 빠르고 정확하게 수용할 수 있다는 점에서 정리해 봅니다. 그러나 이 방식의 단점은 특정한 데이터 파일을 볼 수 있는 앱을 별도로 설치해줘야 한다는 점입니다. 위의 코드들을 위해 제가 설치한 프로그램은 DWGSee와 Adobe Reader였습니다.

APK에 데이터 파일 넣어 사용하기

안드로이드 설치 패키지인 APK 파일에는 이미지, 문자열 등과 같은 데이터뿐만 아니라 임이의 데이터 파일도 넣어 사용할 수 있습니다. 이러한 임이의 데이터 파일은 res 폴더의 서브 폴더인 raw를 직접 만들어 넣어주면 됩니다.

이러한 방식으로 데이터 파일을 저장해 두면 다음의 코드를 통해 해당 데이터 파일에 접근할 수 있는 InputStream 객체를 얻을 수 있습니다.

InputStream database_db = 
    map.getContext().getResources().openRawResource(R.raw.database_db);

이제 이 InputStream 객체를 통해 원하는 디렉토리에 해당 데이터 파일을 복사하고 사용할 수 있습니다. 아래의 코드는 InputStream 객체에 담겨진 데이터를 원하는 파일명으로 저장해 주는 함수입니다.

private boolean copy(InputStream in, String fileName) {
    try {
        OutputStream os = new FileOutputStream(fileName);
        byte[] buffer = new byte[1024];
        int bytesRead;
        while((bytesRead = in.read(buffer)) !=-1) {
            os.write(buffer, 0, bytesRead);
        }
	        
        os.flush();
        os.close();
    } catch (IOException e) {
        return false;
    }

    return true;
}

[Android] ProgressDialog의 메세지(Message) 폰트 크기 키우기

안드로이드에서 사용자에게 잠시 기다려 줄 것을 요청하는 방법 중 하나로 ProgressDialog를 사용합니다. 그런데 이 ProgressDialog에 표시되는 메세지의 폰트가 쥐불알만합니다..

사용자 삽입 이미지
해서 이 폰트를 전체적인 화면과 어울리게 좀 키워보려고 했고, 그 방법 중에 가장 간단한 방법은 다음과 같습니다.

inkTaskProgressDlg = ProgressDialog.show(
    DASSActivity.this, 
    "펜 메모 준비",
    Html.fromHtml("지도 이미지에 대한 펜 메모를 준비 중입니다. 잠시만 기다려 주세요.."), 
    true, 
    false);

네, 바로 Html.fromHtml를 이용해 텍스트에 스타일을 지정하는 방법입니다. HTML 방식으로 문자 스타일을 지정하니 색상이며 굵기등도 지정이 가능합니다. 안드로이드… 상당히 쓸만한 물건이라는 생각입니다. 위의 코드에 대한 결과는 아래와 같습니다.

사용자 삽입 이미지
다음 주 정도 지자체에 안드로이드 기반의 현장지원시스템을 납품합니다(담당자 분의 납품 승인을 받아야 할텐데.. -_-;). 거즘… 마무리하고 소소하지만 중요한 사용자 편의성을 다듬어 보면서 얻은 내용을 정리해 봅니다.

안드로이드(Android)에서 sqlite 콘솔 사용

안드로이드에서 기본적으로 사용하는 DB는 sqlite입니다. sqlite는 데이터베이스를 하나의 파일 단위로 하여 여러개의 테이블을 묶어 관리합니다. sqlite는 로컬 DBMS이며 이 파일 하나만 복사해서 다른 곳에 복사하면 아무런 문제 없이 사용할 수 있는 편의성이 있습니다.

여기서 설명하는 sqlite의 버전은 3이며 이 sqlite3에서 사용하는 DBMS 파일을 바이너리 형태로 살펴보면 다음 예와 같습니다.

사용자 삽입 이미지

파일명과 확장자는 의미가 없고 그 파일의 내용을 통해 sqlite의 데이터베이스 파일이라는 것을 인식합니다. 이 데이터베이스 파일에서 정보를 살펴보기 위해서 안드로이드에서 제공하는 SDK를 통해 sqlite3.exe 실행파일을 이용할 수 있습니다.

사용자 삽입 이미지

이 데이터베이스(map.mbtiles 파일)에 정의된 테이블 이름을 보기 위한 명령은 다음과 같습니다.

그리고 테이블에 대한 스키마 정보를 보기 위한 명령은 다음과 같습니다.

이제, 테이블 명과 해당 테이블에 대한 스키마 정보를 파악할 수 있으니 SQL 문을 통해 원하는 정보를 얻을 수 있습니다.