728x90

Main Activity를 다음과 같이 해서 성공했다.

import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.widget.Toast;

import com.kakao.kakaonavi.Destination;
import com.kakao.kakaonavi.KakaoNaviParams;
import com.kakao.kakaonavi.KakaoNaviService;
import com.kakao.kakaonavi.Location;
import com.kakao.kakaonavi.NaviOptions;
import com.kakao.kakaonavi.options.CoordType;
import com.kakao.kakaonavi.options.RpOption;
import com.kakao.kakaonavi.options.VehicleType;

import java.security.MessageDigest;
import java.util.LinkedList;
import java.util.List;

import static com.kakao.kakaonavi.KakaoNaviService.*;

public class MainActivity extends AppCompatActivity {
private int position = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

getAppKeyHash();

onNaviButtonClicked();
}
private void getAppKeyHash() {
try {
PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md;
md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String something = new String(Base64.encode(md.digest(), 0));
Log.e("Hash key", something);
}
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("name not found", e.toString());
}
}


private void onNaviButtonClicked() {
position = 4;

if (position == -1) {
Toast.makeText(getApplicationContext(), "실행하고 싶은 목적지 공유 / 길 안내를 선택하세요.", Toast.LENGTH_LONG).show();
return;
}
Location kakao = Location.newBuilder("카카오 판교 오피스", 321256, 533732).build();
KakaoNaviParams params;
switch (position) {
case 1:
params = KakaoNaviParams.newBuilder(kakao).build();
KakaoNaviService.getInstance().shareDestination(this, params);
break;
case 2:
kakao = Destination.newBuilder("카카오 판교 오피스", 127.10821222694533, 37.40205604363057).build();
params = KakaoNaviParams.newBuilder(kakao).setNaviOptions(NaviOptions.newBuilder().setCoordType(CoordType.WGS84).build()).build();
KakaoNaviService.getInstance().shareDestination(this, params);
break;
case 4:
kakao = Location.newBuilder("카카오 판교 오피스", 321256, 533732).build();
params = KakaoNaviParams.newBuilder(kakao).setNaviOptions(new NaviOptions.Builder().build()).build();
KakaoNaviService.getInstance().navigate(this, params);
break;
case 5:
kakao = Destination.newBuilder("카카오 판교 오피스", 127.10821222694533, 37.40205604363057).build();
Location stop = Location.newBuilder("서서울호수공원", 126.8322289016308, 37.528495607451205).build();
List<Location> stops = new LinkedList<Location>();
stops.add(stop);
params = KakaoNaviParams.newBuilder(kakao).setNaviOptions(NaviOptions.newBuilder().setCoordType(CoordType.WGS84).build()).setViaList(stops).build();
KakaoNaviService.getInstance().navigate(this, params);
break;
case 6:
params = KakaoNaviParams.newBuilder(kakao).setNaviOptions(NaviOptions.newBuilder().setRouteInfo(true).build()).build();
KakaoNaviService.getInstance().navigate(this, params);
break;
default:
break;
}
}
}

먼저 kakao developer 사이트에 앱을 추가한다.

설정정보를 입력하는데
항목 중 "키해시"가 있다.

위 예제를 실행시키면 Log에 키해시값이 찍힌다.

그값을 입력하면 된다.

gradle.properties 는 다음과 같다. #표시된 것은 주석이므로 없어도 상관없음.

해당 값을 직접 사용되는곳에 입력해도 됨

# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

KAKAO_SDK_GROUP=com.kakao.sdk
VERSION_CODE=76
KAKAO_SDK_VERSION=1.17.0

ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=27
ANDROID_BUILD_SDK_VERSION=android-27
ANDROID_BUILD_TOOL_VERSION=28.0.3
ANDROID_SUPPORT_LIB_VERSION=27.0.1
GOOGLE_PLAY_SERVICES_VERSION=12.0.1
JUNIT_VERSION=4.12
ROBOLECTRIC_VERSION=4.2
ROBOLECTRIC_SHADOW_VERSION=3.3.2
MOCKITO_VERSION=2.25.0
HAMCREST_VERSION=1.3

org.gradle.daemon=false
org.gradle.parallel=false
org.gradle.configureondemand=true

DEFAULT_PHASE=production
NEXUS_USERNAME=username
NEXUS_PASSWORD=1234
NEXUS_RELEASE_REPOSITORY_URL=url1
NEXUS_SNAPSHOT_REPOSITORY_URL=url2

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

build.gradle(project) 은 다음과 같다.

apply plugin: 'com.android.application'

android {
compileSdkVersion ANDROID_BUILD_SDK_VERSION
defaultConfig {
applicationId "com.nobang.custom.kakaonavitest"
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//implementation 'com.android.support:appcompat-v7:28.0.0'

implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

implementation group: 'com.kakao.sdk', name: 'kakaonavi', version: project.KAKAO_SDK_VERSION

// implementation project(':libraries:kakaonavi')

implementation "com.android.support:appcompat-v7:$ANDROID_SUPPORT_LIB_VERSION"
implementation "com.android.support:design:$ANDROID_SUPPORT_LIB_VERSION"
}

 

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

build.gradle(module) 은 다음과 같다.

apply plugin: 'com.android.application'

android {
compileSdkVersion ANDROID_BUILD_SDK_VERSION
defaultConfig {
applicationId "com.nobang.custom.kakaonavitest"
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//implementation 'com.android.support:appcompat-v7:28.0.0'

implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

implementation group: 'com.kakao.sdk', name: 'kakaonavi', version: project.KAKAO_SDK_VERSION

// implementation project(':libraries:kakaonavi')

implementation "com.android.support:appcompat-v7:$ANDROID_SUPPORT_LIB_VERSION"
implementation "com.android.support:design:$ANDROID_SUPPORT_LIB_VERSION"
}

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

설정의 세세함은 잘 모르겠으나... KAKAO Sample앱은 여러개가 한번에 있어... 잘 모르겠더군.

Navi만 사용하는 것으로 성공함.

 

728x90
728x90
한 10년 됐나?
종진이가 주고 간 접이식 자전거
많이 녹슬고 바구니 밑에 구멍도 나고 물받이도 부러지고 기어조절도 안되는데

지금껏 정~말 잘 타고 다녔다
안잠그고 갔다왔는데도 안가져갔었고
또 한번은 자물쇠만 가져가고
바구니에 쓰레기도 버려지고 했었는데

막상 없어지니 참... 아쉽네

그걸 가져가냐
728x90
728x90

오랜만에 이전 앱의 소스를 찾아서 다시 배포하려고 보니
keystore password를 잊어버린것이다. ㅡㅡ

어디 적어놓은 곳도 기억이 안나고...

해결법이 있다.
https://code.google.com/archive/p/android-keystore-password-recover/wikis/HowTo.wiki

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

먼저 java가 깔려있는 상태에서

위 링크의 AndroidKeystoreBrute_xxx.jar 를 다운받는다.(가능하면 keystore 파일이 있는곳으로 옮긴다)

윈도우 + R 누른 뒤 command 를 입력하고 엔터를 치면 커맨드 창이 나온다
keystore 파일이 있는곳으로 이동 cd c:\keystore 같이

찾는방법이 3가지 있는데 파일명이 xxx.keystore 을 입력하면된다.
1. java -jar AndroidKeystoreBrute_v1.05.jar -m 1 -k <...keystore> -start AAAAAA

java -jar AndroidKeystoreBrute_v1.05.jar -m 1 -k "testkeystore.keystore" -start AAAAAA
입력하면 AAAAAA -> AAAAAB -> AAAAAC 와 같이 일일이 대입하는 방식이다.

추천하는 방법은 3번. wordlist.txt 파일을 만든 뒤에
가능성 있는 단어들을 입력한다.(한줄에 한단어씩)
java -jar AndroidKeystoreBrute_v1.05.jar -m 3 -k "C:\\mykeystore.keystore" -d "wordlist.txt"
그러면 wordlist.txt의 단어를 대입하여 찾는다.

찾게되면
Password is : xxx for alias mykeystore

alias가 mykeystore
여기에 대한 password가 xxx

 

 

 

 

 

 

728x90
728x90

한동안 너튜브를 볼때면 꼭 찝어 보던 병원놀이...

그래서 준비했다.

Playmobil 병원놀이

 

상자를 오픈하면....

부품들이 종류별(색깔별) 비닐봉지에 담겨 있고 연결하는 부품이 있다.

드라이버처럼 생긴걸로다가 연결 부품 (빨간색과 노란색 두종류가 있음)을 끼운 뒤
연결부위에 꾹 누르면 틱하는 소리가 나면서 딱 들어간다.

쉽다면 쉽게 볼 수도 있는데 나의 경우 생각보다 힘이 더 들어가고
처음엔 요령이 없어서 누르는 엄지 손가락이 좀 아팠다.

누를 때 한번 삐끗하자. 손톱을 베이는 상처가 났다 ㅡ.ㅡ

혼자서 했으면 15분정도면 됐을 것 같은데 (291개)
처음에 헤매기도 했고 작은거 만들어 던져주고 가지고 노는동안
큰거 조립하다가 또 작은거 만들어 던져주고 했더니 대략 1시간 정도 걸린 것 같다.

다 조립하고 스티커 붙이기는 좀 여렵다.
스티커를 먼저 붙여놓고 조립하면 깔끔하게 될 듯.
설명서에 스티커 붙이는 부위가 빠진게 있는데 아래 사진참조
- 아기 바구니에 붙이는거

- 튜브에 붙이는 스티커


다 조립하고 나서 보니 오~~ 디테일이 장난 아님.

한마디로 쩔어~.

캐릭터 모양은 내스타일이 아니지만
수술실 도구며 침대, 데스크, 화장실 등 인테리어랑 소품들이 장난감이지만 무척이나 실제것과 비슷한 느낌이 난다.

이후로 너튜브에서 본대로 나나라고 이름지은 아이가 높은데서 떨어져 (엠버한테) 실려오고

수술하다가 심작박동수가 떨어져 CPR하고 정상수치로 올라와 수술은 마치고
머리에 붕대, 다리에 캐스트하고 침대에 뉘인 후 간호사가 밀어서 엘레베이터를 거쳐 병실로 옮김.
혼자서 화장실가서 응가하고 손씻음.

정문으로 마샤가 들어와서 데스크에 나나가 어디있는지 물어본다음 엘레베이터 타고 입원실로 옴
의자에 안아있다가 음료수 먹음.

애기가 울고 우유주고 아기용 변기에서 똥싸고 세면대에 가서 씻기고 나시 뉘여서 재우고
1층으로 데려와 키 재고 몸무게 재고

나나는 회복해서 붕대랑 풀고 퇴원
다시 높은데로 올라가 떨어져 다침. 엠버가 싣고 옴 ...이것의 반복~~~ 잘 시간 될 때까지...

상품가격이 6만원, 배송비 4만원(해외배송 1주일내 도착)인건 함정.. ㅜ.ㅜ
하지만 디테일에 놀라 다른 시리즈를 찾고 있는 나.
역사놀이도 교실을 꾸며놓은건데 이것도 의자, 책상, 책가방, 칠판도 있는 등 소품이 아주 잘 구성되어 있다.

상품이야 뭐 그렇다 치는데 배송비가 넘 비싸다.

 

 

 

728x90
728x90

xml에 정의

<View
        android:id="@+id/view"
        class="android.support.v4.view.ViewPager" ... </View>

java에서 사용

import android.support.v4.view.ViewPager;

ViewPager viewPager = (ViewPager) findViewById(R.id.view); 

위와 같이 했는데

Caused by: java.lang.ClassCastException: android.view.View cannot be cast to android.support.v4.view.ViewPager

오류가 난다...

이럴 때는 xml에 class를 별도로 지정하지 않고 Tag에 전체경로를 쓰면 된다.

<android.support.v4.view.ViewPager
        android:id="@+id/view"  ...
728x90

영화 돈 후기

2019. 3. 28. 00:05
728x90
작전과 계속 비교가 되는 건 어쩔 수 없지

긴장감이 점점 고조되는데 풀리면서 그대로 끝난다...

주인공이 역전하는 과정을 다시 풀어가야 재미가 배가될 것 같다.
마치 2부작에서 1부까지만 본 듯한 마무리가 되지 않은 느낌

후속작에서 제대로 마무리를 하길를 바란다
728x90
728x90
어제 잠자리에 들 기 전 솜이가 유치원에 가기 싫다고 했다.

이유를 물어보니
자기는 밥을 빨리 먹고 싶은데 꼴찌로 먹는데며 울음을 터트렸다.

선생님이 자기는 늦게 먹어서 빼빼로도 안줬다고 했다.
자기도 먹고 싶었는데
그래서 아빠가 사준다고 많이 사준다고 달랬다.

또 밥 먹을 때 물도 먹고 싶었는데 못먹게 했다고
선생님이 무섭게 말했어?라고 물으니
아니 예쁘게라고 대답한다
밥 먹기 싫을 때 일부로 물을 자주먹는 걸 알지만 그래도 물먹는 것을 뭐라 하지는 않았었다

며칠전에도 가기 싫다고 했었는데 이유가
유치원가면 자기가 떠먹어야 한다고...

밥 먹이는 습관을 잘못 들인건가
나랑 밥먹을 때 30분정도 걸리고 먹여주기도 하고 그래도 잘 안 먹을 때는 동영상보여준다고 하며 어렵게 먹였는데

어찌해야 하나...고민되네
728x90
728x90


결론 : 사지마라

골판지를 이용한거라 내구성도 그닥.
조립법은 간단한데
조립하고 나면 촛점이 안맞을 수 있다
이거 맞추기가 어렵다 ㅋ

다이소에서 5천원짜리 사는게 이득이다
(저거 2500원에 3주 기다림...)
728x90
728x90

Android 에서 파일 저장할 떄

1. 권한이 있는가?

AndroidManifest.xml 에 권한 설정 확인

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


권한이 부여되어 있다면 저장 경로확인

일반적으로 저장할 때 사용하는 경로는 getAbsolutePath() 아래에 파일명을 추가하면 된다.

String path = Environment.getExternalStorageDirectory().getAbsolutePath()

storage/emulated/0번째 아래에 myaudio.3gp 로(파일명은 다르겠지만) 저장된다.

그런데 내가 원하는 경로로 했을 때 해당 경로가 없으면 저장이 되지 않는다.

abc라는 폴더가 있는지 확인하고 없으면 생성하도록 한다.

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/abc/";
File dir = new File(path);
if(!dir.exists()) {
dir.mkdirs();
}

filename = path + "myaudio.3gp"



728x90
728x90

RecyclerView 를 사용할 때

build.gradle 에 depencies 에 정의를 추가해야 하는데

버전 설정이 중요하다.


먼저 appcompat와 버전을 동일하게 해야 한다고 한다.

그런데 v7:28로 recycleview를 맞췄는데도 안되더라...


그래서 아래와 같이 v7:+ 로 하니까 됨.

dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
// implementation 'com.android.support:recyclerview-v7:28.1.0'
implementation 'com.android.support:recyclerview-v7:+'

}

 


728x90
BLOG main image
"그게 뭐 어쨌다는 거냐?" 늘 누가 나에게 나에대한 말을할 때면 이말을 기억해라. by nobang

카테고리

nobang이야기 (1951)
Life With Gopro (7)
Life With Mini (79)
Diary (971)
너 그거 아니(do you know) (179)
난 그래 (159)
Study (290)
속지말자 (10)
Project (34)
Poem (15)
Song (0)
Photo (113)
낙서장 (45)
일정 (0)
C.A.P.i (2)
PodCast (0)
nobang (27)
고한친구들 (4)
recieve (0)
History (0)
android_app (2)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :