본문 바로가기
코딩맛보기

안드로이드 웨어러블 와치 코딩 맛보기 2/3

by 101Architect 2015. 10. 8.


<안드로이드 웨어러블 와치 코딩 맛보기>

android wearable watch

이번에는 핸드폰과 시계(와치)의 주 기능 위주의 소스를 살펴보도록 하겠습니다. 

이번 포스팅 순서 

--------------------------------------------

  1. 시계에 알림 보내기
  2. 시계에서 폰의 어플 재실행
  3. 시계 알림 아이콘 변경
  4. 시계 알림 글자, 아이콘 변경
  5. 시계 그룹 알림 붙여보내기
  6. 시계에서 폰의 전화, 문자 어플 실행 
  7. 시계 화면 하단 절반 영역의 알림 제어
  8. 시계에서 액션마다 다른 값으로 어플에 전달 
  9. 시계 음성 인식 값을 어플로 전달
--------------------------------------------


1. 시계 알림 보내기

static final int BASIC_ID = 0;
basicBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
noti = new NotificationCompat.Builder(NotificationActivity.this)
.setContentTitle("Title")
.setContentText("Text")
.setSmallIcon(R.mipmap.ic_launcher)
.build();

manager.notify(BASIC_ID, noti);
}
});

2. 시계에서 폰에 어플 재실행

basicBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

//엑티비티 전환을 위한 인텐트
//이동전 엑티비티, 이동 후 엑티비티로 화면전환
//핸드폰 -> 시계 -> 핸드폰 어플 재시작
Intent viewIntent = new Intent(NotificationActivity.this, NotificationActivity.class);

// 어플에서만 화면 전환됨
// startActivity(viewIntent);

// 시계에서 엑션이 실행할 때까지 대기하는 팬딩 이벤트
PendingIntent pending = PendingIntent.getActivity(NotificationActivity.this, 0, viewIntent, 0);

noti = new NotificationCompat.Builder(NotificationActivity.this)
.setContentTitle("Action Title")
.setContentText("Action Text")
.setSmallIcon(R.mipmap.ic_launcher)
.addAction(R.mipmap.ic_launcher, " Action!!! ", pending)
.build();

manager.notify(Action_ID, noti);

}
});


AndroidManifest.xml 로 가서 첫실행 액티비티 변경

      <activity

          android:name=".IconActivity"

          android:label="@string/title_activity_icon" >


/** 이부분을 첫 실행하는 액티비티로 옮겨 줌 **/

          <intent-filter>

              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />

          </intent-filter>

/*****************************************/

      </activity>

3. 시계 알림 아이콘 변경

Button btn;

//알림 매니저 객체
NotificationManagerCompat manager;

//알림객체
Notification noti;

//기본알림id
static final int ICONBTN_ID = 0;

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

manager = NotificationManagerCompat.from(IconActivity.this);


btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

//알림에 추가할 라지 아이콘
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.check);

noti = new NotificationCompat.Builder(IconActivity.this)
.setContentTitle("LargeIcon Title")
.setContentText("Text")
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(largeIcon)
.setSubText("sub")
.setTicker("ticker")
.setUsesChronometer(true)
.build();
//티커 알리바에 표시되는 알림 문구
//알림 창을 열었을 때 타이틀 밑에 뜨는 문구
//setUsesChronometer 경과시간 시계, 폰의 알림창에 표기

manager.notify(ICONBTN_ID, noti);
}
});

}//onCreate()

4. 알림 글자, 아이콘 변경

bigTxtbtn.setOnClickListener(new View.OnClickListener() {  

@Override
public void onClick (View view) {
//텍스트의 스타일 지정을 위한 클래스
SpannableStringBuilder title = new SpannableStringBuilder();
title.append("BigTextStyle Title");

//글씨의 스타일 종류 RelativeSizeSpan 글씨 크기 조절
//범위 0,5 어디서부터 어디까지 사이즈를 조절할것인지
title.setSpan(new RelativeSizeSpan(1.5f), 0, 5, 0);

//글씨 효과 굵게, 기울이기
title.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5,12, 0);

//글씨 칼라
title.setSpan(new ForegroundColorSpan(Color.RED), 12, 15, 0);

//bigtextsytle 객체 생성
NotificationCompat.BigTextStyle t_style = new NotificationCompat.BigTextStyle();
t_style.setBigContentTitle(title);
t_style.bigText("bic text");

noti = new NotificationCompat.Builder(StyleActivity.this)
.setContentTitle("Bic Txt Title")
.setContentText("bic txt text")
.setSmallIcon(R.mipmap.check)
.setStyle(t_style)
.build();

manager.notify(BIGTXT_ID, noti);
}
});
}//onCreate()



5. 그룹 알림 붙여보내기

Button g1, g2, g3;
Notification noti;
NotificationManagerCompat manager;

static final int G1_ID = 1;
static final int G2_ID = 2;
static final int G3_ID = 3;
static final String G_KEY = "gkey";

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

manager = NotificationManagerCompat.from(GroupActivity.this);

g1 = (Button)findViewById(R.id.group1);
g2 = (Button)findViewById(R.id.group2);
g3 = (Button)findViewById(R.id.group3);

g1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
noti = new NotificationCompat.Builder(GroupActivity.this)
.setContentTitle("G1 Title")
.setContentText("G1 Text")
.setSmallIcon(R.mipmap.ic_launcher)
.setGroup(G_KEY)
.setSortKey("1") //정렬순서(작을 수록 상위에 있슴)
.build();

manager.notify(G1_ID, noti);
}
});

g2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
noti = new NotificationCompat.Builder(GroupActivity.this)
.setContentTitle("G2 Title")
.setContentText("G2 Text")
.setSmallIcon(R.mipmap.ic_launcher)
.setGroup(G_KEY)
.setSortKey("2") //정렬순서(작을 수록 상위에 있슴)
.build();

manager.notify(G2_ID, noti);
}
});

g3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
noti = new NotificationCompat.Builder(GroupActivity.this)
.setContentTitle("G3 Title")
.setContentText("G3 Text")
.setSmallIcon(R.mipmap.ic_launcher)
.setGroup(G_KEY)
.setSortKey("3") //정렬순서(작을 수록 상위에 있슴)
.build();

manager.notify(G3_ID, noti);
}
});
}


6. 전화기 문자보내기 앱에서 열기 
public void onClick(View view) {

//다이얼 화면으로 이동할 인텐트
Intent view1 = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:02-123-456"));
PendingIntent viewDial = PendingIntent.getActivity(MultiActionActivity.this, 0, view1, 0);

//메시지 화면으로 이동할 인텐트
Intent view2 = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:02-123-456"));
view2.putExtra("sms_body", "hello~~~jinhee I miss you...hehe");
PendingIntent viewSms = PendingIntent.getActivity(MultiActionActivity.this, 0, view2, 0);

//현재 앱 실행
Intent view3 = new Intent(MultiActionActivity.this, MultiActionActivity.class);
PendingIntent viewMain = PendingIntent.getActivity(MultiActionActivity.this, 0, view3, 0);

noti = new NotificationCompat.Builder(MultiActionActivity.this)
.setContentTitle("Multi Title")
.setContentText("Multi Text")
.setSmallIcon(R.mipmap.ic_launcher)
.addAction(R.mipmap.ic_launcher, " call ", viewDial)
.addAction(R.mipmap.ic_launcher, " sms ", viewSms)
.setContentIntent(viewMain)
.build();

manager.notify(MULTI_ID, noti);

//권한 등록을 해야 함
/*
<!--AndroidManifest.xml-->
<uses-permission android:name="android.permission.CALL_PHONE">
</uses-permission>
<!--android.permission 소문자여야함-->
*/

}

7. 시계 하단에 절반 알림 제어하기

//시계의 하단에 반절정도로 뜨는 알림 부분을 content 라고 함

//세번째 페이지 생성
Notification thirdPage = new NotificationCompat.Builder(ExtenderActivity.this)
.setContentTitle("Third Title")
.setContentText("Third Text")
.extend(new NotificationCompat.WearableExtender()
.setContentIcon(R.mipmap.check)
.setContentIconGravity(Gravity.START))
.build();

8. 시계에서 액션마다 다른 값으로 어플에 전달하기 

//첫번째 액션 클릭시 전달될 값
intent.putExtra(RESULT_KEY, "Say Action1 !!!");

//첫번째 액션이 실행될 때까지 대기할 팬딩인텐트
//Request code 를 중복되지 않게 다르게 넣어 줘야 한다.
PendingIntent pending1 = PendingIntent.getActivity(BasicNotiActivity.this, 1, intent, 0);

//두번째 액션 클릭시 전달될 값
intent.putExtra(RESULT_KEY, "This is Action2 !!!");

//두번째 액션이 실행될 때까지 대기할 팬딩인텐트
PendingIntent pending2 = PendingIntent.getActivity(BasicNotiActivity.this, 2, intent, 0);

//세번째 액션 클릭시 전달될 값
intent.putExtra(RESULT_KEY, "I wanna send Action3 to you");

//세번째 액션이 실행될 때까지 대기할 팬딩인텐트
PendingIntent pending3 = PendingIntent.getActivity(BasicNotiActivity.this, 3, intent, 0);


//알림 생성 및 액션 추가
noti = new NotificationCompat.Builder(BasicNotiActivity.this)
.setContentTitle("Receive Title")
.setContentText("Receive Text")
.setSmallIcon(R.mipmap.ic_launcher)
.addAction(R.mipmap.check, "a1", pending1)
.addAction(R.mipmap.check, "a2", pending2)
.addAction(R.mipmap.check, "a3", pending3)
.setVibrate(new long[]{0, 300, 100, 300}) //진동 알림 추가
// 0초 대기 0.3초 진동 0.1초 멈춤 0.3초 진동 다시
.build();
manager.notify(RECEIVE_ID, noti);

9. 시계 음성 인식 어플로 전달하기

Intent intent = new Intent(VoiceActivity.this, VoiceSubActivity.class);
intent.putExtra(EXTRA_KEY, "voice action!!!");

//실행되기 전까지 임시로 값을 가지고 있을 인텐트
PendingIntent pending = PendingIntent.getActivity(VoiceActivity.this, 0, intent, 0);


//선택 응답값을 준비
String[] choices = {"YES", "SORRY", "THANKS"};

//음성인식 객체 생성 v4.app 에 있는 객체
//VOICE_RESULT_KEY 최종적으로 전달될 키값
RemoteInput remoteinput = new RemoteInput.Builder(VOICE_RESULT_KEY)
.setLabel("Remote Label")
.setChoices(choices) //선택 응닶값 추가
.build();

//음성인식 객체를 저장할 엑션
NotificationCompat.Action action = new NotificationCompat.Action.Builder(
R.mipmap.ic_launcher, "voice", pending)
.addRemoteInput(remoteinput) //음성인식 객체 추가
.build();

//알림에 액션 추가
noti = new NotificationCompat.Builder(VoiceActivity.this)
.setContentTitle("VoiceActivity Title")
.setContentText("VoiceActivity Text")
.setSmallIcon(R.mipmap.ic_launcher)
.addAction(action)
.build();

manager.notify(VOICE_ID, noti);


반응형