반응형
오늘은 진도 보다 암시적인텐트를 사용하여 여러가지 기능들을 사용해보았다~!!
어짜피 코드로 구성되어 있어서 코드보면서 이해하면되고 딱히 정리할게 없다
암시적 인텐트를 통한 각종 기능 구현 (카메라 , 음성인식, 전화걸기 , 맵 ,브라우저 연결 )
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삭제#안드로이드삭제#이클립스 자바#자바삭제#코딩삭제#코딩공부삭제#안드로이드스튜디오
반응형
'아옳옳의 코딩공부 > 아옳옳의 안드로이드스튜디오' 카테고리의 다른 글
2021-03-10 안드로이드 스튜디오 (매니패스트에 대하여) (0) | 2021.03.10 |
---|---|
2021-03-10 안드로이드 스튜디오 (액티비티 생명주기1) (0) | 2021.03.10 |
2021-03-08 안드로이드 스튜디오 (명시적인텐트 , 암시적인텐트 ) (0) | 2021.03.08 |
2021-03-05 안드로이드 스튜디오 (직렬화) (0) | 2021.03.04 |
2021-03-03 안드로이드 스튜디오 (intent) (0) | 2021.03.03 |