본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-03-09 안드로이드 스튜디오 (암시적인텐트 사용하기)

반응형

오늘은 진도 보다 암시적인텐트를 사용하여 여러가지 기능들을 사용해보았다~!! 

 

어짜피 코드로 구성되어 있어서 코드보면서 이해하면되고 딱히 정리할게 없다 

암시적 인텐트를 통한 각종 기능 구현 (카메라 , 음성인식, 전화걸기 , 맵 ,브라우저 연결 ) 

package com.example.myapp;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.speech.RecognitionService;
import android.speech.RecognizerIntent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button contactsBtn, cameraBtn, speechBtn, mapBtn, browserBtn, callBtn;
    TextView resultView;
    ImageView imageView;
    Intent intent;

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

        contactsBtn = findViewById(R.id.btn_Contacts);
        cameraBtn = findViewById(R.id.btn_Camera);
        speechBtn = findViewById(R.id.btn_Speech);
        mapBtn = findViewById(R.id.btn_Map);
        browserBtn = findViewById(R.id.btn_Browser);
        callBtn = findViewById(R.id.btn_Call);

        resultView = findViewById(R.id.resultView);
        imageView = findViewById(R.id.imageView);
        /* 셋온클릭 리스너 많이 쓰지않기위하여 사용함 위에서
            온클릭리스너를 임플리먼트 (implements View.OnClickListener)
        */
        contactsBtn.setOnClickListener(this);
        cameraBtn.setOnClickListener(this);
        speechBtn.setOnClickListener(this);
        mapBtn.setOnClickListener(this);
        browserBtn.setOnClickListener(this);
        callBtn.setOnClickListener(this);

    }

    // 온클릭 하나로 6개의 버튼을 작동하게 하는것이다
    @Override
    public void onClick(View v) {

        if (v == contactsBtn) {
            //암시적 인텐트
            intent = new Intent(Intent.ACTION_PICK);
            // intent.setData(ContactsContract.Contacts.CONTENT_URI); 주소록에서  사람이름만 보겠다는 것 !
            intent.setData(ContactsContract.CommonDataKinds.Phone.CONTENT_URI); // 주소록에서 사람이름과 전화번호까지
            //두가지중 한개만 사용해야함
            startActivityForResult(intent, 10);

         /*  intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(ContactsContract.Contacts.CONTENT_URI+"/"+1652));
            startActivity(intent);        //연락처의 아이디값으로 찾아 들어가는법 최신폰은 보안상 막힘 */

        } else if (v == cameraBtn) {
            intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 20);
        } else if (v == speechBtn) {
            //사람의 말을 구글 서버에서 전달하여 그 곳에서 문자열로 변환하고 변환된 문자열을 반환받는 방식
            intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            //이미 지정되있는 키값 RecognizerIntent.LANGUAGE_MODEL_FREE_FORM  : 일반적인 음성에 대한 문자열 변환 서비스
            //LANGUAGE_MODEL_WEB_SEARCH : 웹 검색 조건에 기반을 둔 언어 모델
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM );
            //음성을 받아들이기 이해 다이얼로그를 띄우는데, 그 때 다이얼로그의 타이틀 문자열임
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "음석인식 테스트");
            startActivityForResult(intent, 30);

        } else if (v == mapBtn) {
            intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:13.779362105491815, 100.57441843574993"));
            startActivity(intent);
        } else if (v == browserBtn) {
            intent = new Intent(Intent.ACTION_VIEW , Uri.parse("http://m.naver.com"));
            startActivity(intent);
        } else if (v == callBtn) {
            intent = new Intent(Intent.ACTION_DIAL , Uri.parse("tel:010-6332-4080"));
            startActivity(intent);
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 10 && resultCode == RESULT_OK) {
            //URL정보에 마지막 숫자가 선택한 사람의 식별자가 됨 ( 주소록의 아이디)
            //이런식으로 식별자 값을 얻은 후 구체적인 전화번호나 이메일등의 값을 다시 가져와야 함
            String result = data.getDataString();
            resultView.setText(result);
        } else if (requestCode == 20 && resultCode == RESULT_OK) {
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            imageView.setImageBitmap(bitmap);
        } else if (requestCode == 30 && resultCode == RESULT_OK) {
            ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            String result = results.get(0);
            resultView.setText(result);
        }
    }
}

중요한건 온클릭 리스너를 써서 각각의 버튼을 만들면 코드가 길어지기 때문에 

implements View.OnClickListener 이렇게 임플리먼트 해줘서 if 문으로 줄여주었다 이것정도만 자세하게 보고 

나머지 기능에 관련된건 더 공부를 해야 할거 같다 ㅋㅋ 


암시적 인텐트 사용하여 풀어본 숙제 

 

그림투표 액티비티 

public class MainActivity extends AppCompatActivity {
    int[] voteCount = new int[9]; // 카운트 배열 생성

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 베열을 for 문으로 돌려 모든 배열에 0으로 초기화 해줌
        for(int i=0; i<voteCount.length; i++){
            voteCount[i]=0;
        }
        // image 라는 이미지뷰 9개를 담을수 있는 배열생성
        ImageView[] image = new ImageView[9];
        // imageId라는 인트 배열에 이미지의 아이디를 순차 적으로 넣어줌
        int[] imageId = {R.id.image1, R.id.image2, R.id.image3, R.id.image4, R.id.image5,
                R.id.image6, R.id.image7, R.id.image8, R.id.image9};
        //imgName 이라는 스트링배열에 이미지의 이름을 순차적으로 넣어줌
        String[] imgName = {"독서하는 소녀", "꽃 장식 모자 소녀", "부채를 든 소녀", "이레느깡 단 베르양",
                "잠자는 소녀", "테라스의 두 자매", "피아노 레슨", "피아노 앞의 소녀들", "해변에서"};

        Button button = findViewById(R.id.button);
        //이미지아이디의 길이만큼 반복하겠다 뭘 반복하냐
        for(int i=0; i<imageId.length; i++){
            int index = i; // 이너 클래스에서 접근하였을때 상수처리되는데 i가 상수처리 되면 안되기 때문에 따로 임시변수에 담아줬다
            //그리고 이 index는 지역변수이므로 클래스를 빠져나가면 소멸되었다가 다시 생성이 되기때문에 상수 처리 되도 상관없음
            // 이미지뷰배열 index 번째에 있는놈을 이미지뷰 imageId[i]째를 파인드 뷰바이 아이디 해주겠다
            // 예) 지금 i는 0 고로
            // iamge[0] = findViewById(R.id.image1); 이거랑 같은말 이다
            image[index]=findViewById(imageId[i]);

            //0번째 이미지뷰 버튼화 시작 for문으로 돌렸기 때문에 9번 실행하면서 전부 버튼화 시켜줌
            //아래쪽은 이너 클래스이므로 버튼이 눌렸을때 실행한다 고로 버튼먼저 다 만들고 시작한다
            image[index].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //눌렸을때 인덱스 번호에 카운트가 1씩 증가한다
                    voteCount[index]++;
                    Toast.makeText(getApplicationContext(), imgName[index]+" : 총"+voteCount[index]+"표",Toast.LENGTH_LONG).show();
                }
            });

        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            //인텐트로 배열 카운트를 담은 배열과 이름을 담은 배열 넘겨주기
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("android.action.Android_Self");
            //  intent.addCategory("com.example.category.MYCATEGORYDA"); 테스트용으로 적었다
                intent.putExtra("VoteCount",voteCount);
                intent.putExtra("ImageName",imgName);
                startActivity(intent);
            }
        });



    }

 

위에서 중요한 내용은 같은 비슷한 속성의 것들을 ( 이미지뷰 , 그림아이디 등등  ) 여러번 적게 되면 코드가 길어지므로 배열에 넣어줌과 동시에 for문을 통하여   findViewById 해주었다는걸 잘 보아야 한다 자주 쓸거같은 느낌적인 느낌

 

 

내용을 전달해줄 곳 매니패스트 먼저 작성

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.self_chek3">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Chap07">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.action.Android_Self"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.LAUNCHER" />
                <!-- <category android:name="com.example.category.MYCATEGORYDA"/> 그냥 테스트용으로 적었다 -->
            </intent-filter>
        </activity>
    </application>

</manifest>

투표한 결과순서에 따라서 그림정렬하여 출력해주기 

public class MainActivity extends AppCompatActivity {
    ViewFlipper viewFlipper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewFlipper = findViewById(R.id.viewFliper);
        Button button1 = findViewById(R.id.button1);
        Button button2 = findViewById(R.id.button2);
        viewFlipper.setFlipInterval(1000);

        int[] iv = {R.id.img1,R.id.img2,R.id.img3,R.id.img4,R.id.img5,R.id.img6,R.id.img7,R.id.img8,R.id.img9};
        int[] img = {R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5,
                R.drawable.pic6, R.drawable.pic7, R.drawable.pic8, R.drawable.pic9};
        ImageView[] imageViews= new ImageView[iv.length];
       //이미지뷰 for문을 이용한 findViewById
        for(int a = 0 ; a < iv.length ; a++){
            imageViews[a] = findViewById(iv[a]);
        }

        Intent intent = getIntent(); // 암시적인텐트 받아주기
        int[] voteResult = intent.getIntArrayExtra("VoteCount");

        int val = 0; // 임시변수 

            for (int i = 0; i < voteResult.length-1; i++) {
                for (int j = i ; j < voteResult.length-1; j++) {
                    if (voteResult[i] < voteResult[j+1]) { 
                        val = voteResult[j+1];  // 중첩for문으로 큰순서대로 정렬
                        voteResult[j+1] = voteResult[i];
                        voteResult[i] = val;
                        val = img[j+1];  // 그림도 같이 정렬 
                        img[j+1] = img[i];
                        img[i] = val;

                    }
                }
            }


        for(int i = 0 ; i<voteResult.length; i++){
            imageViews[i].setImageResource(img[i]);

        }

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewFlipper.startFlipping();
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewFlipper.stopFlipping();
            }
        });

    }
}

 

사진투표

 

이렇게 순서대로 정렬된 이미지를 보여주는 프로그램을 작성해보았다 

혼자서 할때는 좀 버벅 거리고 헷갈리고 그러는데 그래도 설명 듣고 나면 곧잘 따라하니 ... 그걸로 만족하자 ㅋ

 

앞으로도 쭉 화이팅~!!! 

 

 

(21-03-10 복습 1회)

#java삭제#안드로이드삭제#이클립스 자바#자바삭제#코딩삭제#코딩공부삭제#안드로이드스튜디오

반응형