<안드로이드 웨어러블 와치 코딩 맛보기>
android wearable watch
이번에는 핸드폰과 시계(와치)의 주 기능 위주의 소스를 살펴보도록 하겠습니다.
이번 포스팅 순서
--------------------------------------------
- 시계에 알림 보내기
- 시계에서 폰의 어플 재실행
- 시계 알림 아이콘 변경
- 시계 알림 글자, 아이콘 변경
- 시계 그룹 알림 붙여보내기
- 시계에서 폰의 전화, 문자 어플 실행
- 시계 화면 하단 절반 영역의 알림 제어
- 시계에서 액션마다 다른 값으로 어플에 전달
- 시계 음성 인식 값을 어플로 전달
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);
}
});
<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>
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()
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()
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);
}
});
}
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 소문자여야함-->
*/
}
//시계의 하단에 반절정도로 뜨는 알림 부분을 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();
//첫번째 액션 클릭시 전달될 값
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);
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);
'코딩맛보기' 카테고리의 다른 글
안드로이드 웨어러블 와치 코딩 맛보기 3/3 (1) | 2016.01.04 |
---|---|
안드로이드 웨어러블 와치 코딩 맛보기 1/3 (0) | 2015.10.04 |