자바 안드로이드 앱개발 강좌, 안드로이드 기본 앱과 연동하기

1. 서론

현대의 모바일 환경에서 안드로이드 플랫폼은 가장 광범위하게 사용되는 운영체제 중 하나입니다. 특히
자바 언어를 사용하여 앱을 개발하는 것은 많은 개발자들에게 친숙한 방법입니다. 본 강좌에서는
자바를 활용하여 안드로이드 기본앱과의 연동을 통해 앱 개발의 기초부터 시작하여 한 단계
더 나아가 다양한 기능을 구현해보도록 하겠습니다. 본 강좌를 통해 여러분은 안드로이드 앱과
기본 앱(예: 연락처, 카메라 등) 간의 상호작용을 이해하고 직접 구현할 수 있는 능력을 기르게 될
것입니다.

2. 안드로이드 앱 개발 환경 설정

안드로이드 앱을 개발하기 위해서는 먼저 개발 환경을 설정해야 합니다. Android Studio를
사용하면 많은 편리한 도구와 기능을 제공받을 수 있습니다. 아래는 Android Studio 설치 방법입니다.

  1. Android Studio 다운로드: 구글 공식 사이트에서 다운로드합니다.
  2. 설치: 설치 마법사를 따라 진행합니다.
  3. SDK 설치: 필요한 SDK와 도구가 자동으로 설치됩니다.
  4. 프로젝트 생성: ‘New Project’를 클릭하여 새로운 안드로이드 프로젝트를 생성합니다.

3. 안드로이드 기본 앱 이해하기

안드로이드에는 여러 종류의 기본 앱이 있습니다. 이들 앱은 개발자가 외부 라이브러리를
사용하지 않고도 손쉽게 활용할 수 있는 기능을 제공합니다. 예를 들어 연락처 앱, 카메라 앱,
지도 앱 등이 있습니다. 이 장에서는 연락처 앱과 연동되는 예제를 통해 기본 앱의 기능을
사용해 보겠습니다.

4. 연락처 앱과 연동하기

연락처 앱과 연동하여 연락처 정보를 가져오는 기능을 구현해보겠습니다. 아래는 이 기능을
구현하기 위한 단계입니다.

4.1. 권한 요청하기

연락처에 접근하기 위해서는 사용자에게 권한을 요청해야 합니다. AndroidManifest.xml 파일에
다음과 같은 퍼미션을 추가합니다.

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

4.2. 연락처 정보 가져오기

이제 MainActivity.java 파일을 열고 연락처 정보를 가져오는 코드를 작성해보겠습니다.

                
                import android.Manifest;
                import android.content.ContentResolver;
                import android.content.pm.PackageManager;
                import android.database.Cursor;
                import android.net.Uri;
                import android.os.Bundle;
                import android.provider.ContactsContract;
                import android.view.View;
                import android.widget.Button;
                import android.widget.TextView;
                import androidx.annotation.NonNull;
                import androidx.appcompat.app.AppCompatActivity;
                import androidx.core.app.ActivityCompat;

                public class MainActivity extends AppCompatActivity {
                    private static final int REQUEST_CODE_CONTACT = 1;
                    private TextView textView;

                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                        
                        textView = findViewById(R.id.textView);
                        Button button = findViewById(R.id.button);
                        
                        button.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                checkPermission();
                            }
                        });
                    }

                    private void checkPermission() {
                        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE_CONTACT);
                        } else {
                            getContacts();
                        }
                    }

                    private void getContacts() {
                        ContentResolver resolver = getContentResolver();
                        Uri uri = ContactsContract.Contacts.CONTENT_URI;
                        Cursor cursor = resolver.query(uri, null, null, null, null);
                        
                        StringBuilder contactsList = new StringBuilder();
                        
                        while (cursor.moveToNext()) {
                            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                            contactsList.append(name).append("\n");
                        }
                        cursor.close();
                        textView.setText(contactsList.toString());
                    }

                    @Override
                    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
                        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                        if (requestCode == REQUEST_CODE_CONTACT && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            getContacts();
                        }
                    }
                }
                
            

4.3. UI 구성하기

activity_main.xml 파일을 열고 UI를 구성합니다. 기본적으로 Button과 TextView를 추가합니다.

                
                <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">
                    <Button
                        android:id="@+id/button"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="연락처 가져오기" />

                    <TextView
                        android:id="@+id/textView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content" />
                </LinearLayout>
                
            

4.4. 실행하기

이제 프로젝트를 실행해보세요. ‘연락처 가져오기’ 버튼을 클릭하면 연락처 목록이 TextView에
표시됩니다. 권한을 요청하는 창이 뜨면 허용을 클릭해야 연락처 정보를 가져올 수 있습니다.

5. 카메라 앱과 연동하기

다음으로는 카메라 앱과 연동하여 사진을 촬영하는 기능을 구현해보겠습니다. 카메라 연동
또한 기본 앱간의 연동을 보여주는 훌륭한 예입니다.

5.1. 권한 요청하기

카메라에 접근하기 위해 권한을 요청하는 방법은 연락처 앱과 유사합니다. AndroidManifest.xml에
다음과 같이 추가합니다.

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

5.2. 사진 촬영하기

MainActivity.java 파일에 촬영 기능을 추가합니다.

                
                import android.content.Intent;
                import android.graphics.Bitmap;
                import android.net.Uri;
                import android.os.Bundle;
                import android.provider.MediaStore;
                import android.widget.Button;
                import android.widget.ImageView;
                import androidx.appcompat.app.AppCompatActivity;

                public class MainActivity extends AppCompatActivity {
                    private static final int REQUEST_IMAGE_CAPTURE = 1;
                    private ImageView imageView;

                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                        
                        Button button = findViewById(R.id.button);
                        imageView = findViewById(R.id.imageView);
                        
                        button.setOnClickListener(view -> {
                            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                                startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                            }
                        });
                    }

                    @Override
                    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                        super.onActivityResult(requestCode, resultCode, data);
                        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
                            Bundle extras = data.getExtras();
                            Bitmap imageBitmap = (Bitmap) extras.get("data");
                            imageView.setImageBitmap(imageBitmap);
                        }
                    }
                }
                
            

5.2. UI 구성하기

activity_main.xml 파일에 ImageView를 추가하여 촬영한 사진을 보여줄 수 있도록 합니다.

                
                <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">
                    <Button
                        android:id="@+id/button"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="사진 찍기" />

                    <ImageView
                        android:id="@+id/imageView"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </LinearLayout>
                
            

5.4. 실행하기

이제 프로그램을 실행하고 ‘사진 찍기’ 버튼을 클릭해보세요. 정상적으로 작동하면 카메라가
실행되며, 사진을 촬영 후 결과가 이미지뷰에 표시됩니다.

6. 결론

이번 강좌에서는 자바를 활용하여 안드로이드 기본 앱과의 연동 방법에 대해 알아보았습니다.
연락처와 카메라 앱 연동을 통해 앱 개발에서 기본 앱의 기능을 어떻게 활용할 수 있는지를
배웠습니다. 여러분은 이 예제를 바탕으로 자신만의 앱 기능을 확장하고 다양한 형태의
연동을 시도해볼 수 있습니다. 계속해서 안드로이드 앱 개발을 학습하고 실습하면서 더욱
발전하여 나가시기 바랍니다!