이헌제의 블로그

GPS 수신




// 작성일자 : 2017-04-21



최근 크롬 버전에서 GPS가 geolocation API 로 수신되지 않는다. 


다음과 같은 경고메시지를 크롬 브라우저의 개발자 도구에서 확인할 수 있다.


getCurrentPosition() and watchPosition() no longer work on insecure origins. ... use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details.



요약하면 보안상의 이유로 HTTPS를 사용하라는 이야기이다.


HTTPS는 HTTP 와 SSL을 함께 사용하는 보안 프로토콜인데, 이를 적용하려면 여러가지 해야할 일이 많아진다.


해서 다음과 같은 해결방법을 찾았다.


참고 : http://jsfiddle.net/gogs/jwt9f1o3/


var apiGeolocationSuccess = function(position) {
alert("API geolocation success!\n\nlat = " + position.coords.latitude + "\nlng = " + position.coords.longitude);
};

var tryAPIGeolocation = function() {
jQuery.post( "https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyDCa1LUe1vOczX1hO_iGYgyo8p_jYuGOPU", function(success) {
apiGeolocationSuccess({coords: {latitude: success.location.lat, longitude: success.location.lng}});
})
.fail(function(err) {
alert("API Geolocation error! \n\n"+err);
});
};

var browserGeolocationSuccess = function(position) {
alert("Browser geolocation success!\n\nlat = " + position.coords.latitude + "\nlng = " + position.coords.longitude);
};

var browserGeolocationFail = function(error) {
switch (error.code) {
case error.TIMEOUT:
alert("Browser geolocation error !\n\nTimeout.");
break;
case error.PERMISSION_DENIED:
if(error.message.indexOf("Only secure origins are allowed") == 0) {
tryAPIGeolocation();
}
break;
case error.POSITION_UNAVAILABLE:
alert("Browser geolocation error !\n\nPosition unavailable.");
break;
}
};

var tryGeolocation = function() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
browserGeolocationSuccess,
browserGeolocationFail,
{maximumAge: 50000, timeout: 20000, enableHighAccuracy: true});
}
};

tryGeolocation();


동작 확인 완료!

저작자 표시 비영리 변경 금지
신고

Comment +0

JavaCV 연동



본문 작성일 : 2017.03.30


JavaCV 는 안드로이드에서 영상을 처리하기 위한 라이브러리로 쓰인다. 개발자들 사이에서 얼마나 널리 쓰이는 지는

잘 모르겠지만 저자는 OpenCV 와 함께 ffmpeg을 추후 개발시에 사용하기 위해서 라이브러리화 되어 있는 JavaCV를

포함시키고자 했다.


본 글의 목적은 필요한 여러가지 설명보다는 JavaCV를 AndroidStudio에 연동하는 방법을 소개합니다.



실패 이력


JavaCV 라이브러리에서는 gradle을 통해서 compile 하는 방법을 소개하고 있다.


  dependencies {

    compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.3.2'

  }



이와 같이 하면 저자는 Build시에 Duplication file 에러가 떨어졌다.

preset 컴파일을 시행해도 같은 결과가 나왔다.


따라서 수동으로 라이브러리를 가져오도록 했다.




수동 설치


1) JavaCV 바이너리 파일 다운로드 : javacv-platform-1.3.2-bin.zip


2) 다운로드 파일 압축해제


3) Android Studio New Project - 프로젝트 생성


4) jniLibs/armeabi-v7a 폴더 생성

 


5) jniLibs 폴더에 필요한 jar 파일 이동


  - ffmpeg.jar

  - opencv.jar

  - javacv.jar

  - javacpp.jar



6) so 파일이 필요한데 환경이 javacv가 필요한 환경이 android 이므로 다음 파일을 압축해제

※ jar 파일 압축해제가 안된다면 7zip 이용 : http://www.7-zip.org/download.html


 - ffmpeg-android-arm.jar

 - opencv-android-arm.jar



7) lib/armeabi/*.so 파일 > jniLibs/armeabi-v7a/ 로 이동



8) preset을 위해서 META-INF 파일도 이동



9) build.gradle 파일을 통해 컴파일 설정


apply plugin: 'com.android.application'

android {
compileSdkVersion 24
buildToolsVersion "24.0.1"

defaultConfig {
applicationId "com.tistory.whiteduck.javacvtest"
minSdkVersion 18
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

packagingOptions {
exclude 'META-INF/services/javax.annotation.process.Precessor'
pickFirst 'META-INF/maven/org.btyedeco.javacpp-presets/opencv/pom.properties'
pickFirst 'META-INF/maven/org.btyedeco.javacpp-presets/opencv/pom.xml'
pickFirst 'META-INF/maven/org.btyedeco.javacpp-presets/ffmpeg/pom.properties'
pickFirst 'META-INF/maven/org.btyedeco.javacpp-presets/ffmpeg/pom.xml'
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile fileTree(dir: 'jniLibs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
compile files('src/main/jniLibs/javacpp.jar')
compile files('src/main/jniLibs/javacv.jar')
compile files('src/main/jniLibs/opencv.jar')
compile files('src/main/jniLibs/ffmpeg.jar')

compile 'gun0912.ted:tedpermission:1.0.3' // M + permission
}





테스트


수동 설치는 모두 끝났다 제대로 됬는지 확인해보자.


1) MainActivity.java

 - javacv-bin/sample/RecordActivity.java 를 참조

 - tedPermission을 통해서 권한 설정

 - 저장파일 주소 변경



MainActiivty.java 보기



2) AndroidManifest.xml

 - MainActivity는 카메라, 오디오 녹음, 외부저장장치 저장 권한이 필요하다.


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


3) acitivity_main.xml - 레이아웃 설정

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.tistory.whiteduck.javacvtest.MainActivity">

<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />

<Button
android:id="@+id/recorder_control"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
</LinearLayout>



실행결과






 javacv git   : https://github.com/bytedeco/javacv

7zip     : http://www.7-zip.org/download.html

ted permission ( M+ 권한 )  : https://github.com/ParkSangGwon/TedPermission

저작자 표시 비영리 변경 금지
신고

'Android Story' 카테고리의 다른 글

[ Android ] JavaCV 연동  (0) 2017.03.30
[ Android ] 틴트(오버레이) 색상 지정하기  (0) 2017.03.28
[ Android ] 줄번호 설정  (0) 2017.01.13
[ Android ] FFmpeg Rtsp Player 사용하기  (6) 2016.12.27
[ Android ] Network type  (0) 2016.12.19
[ Android ] FFplay 문서 번역  (0) 2016.12.13

Comment +0

Lollipop 에서 비트맵에 틴트 칠하기



안드로이드 Lollipop 이상에서는 bitmap 마크업 언어를 통해서 비트맵에 틴트를 칠할 수 있다. 이 기능은 모든 drawable에서 동작하지는 않는다. 예를 들어 아래의 drawable_tint.xml와 같이 정의된 bitmap drawable에 다시 적용할 수 없다는 점이다. <bitmap android:src="@drawable/drawable_tint"/> 



틴트


res/drawable/drawable_tint/xml

<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/ic_launcher"
android:tint="@color/colorAccent"
android:tintMode="multiply"
/>


틴트 모드

tint에 적절한 색상을 섞어 이미지에 색상을 오버레이 할 수 있다.
tintMode 속성에 관해서는 다음과 같이 정의되어 있다.

ConstantValueDescription
add10Combines the tint and drawable color and alpha channels, clamping the result to valid color values. Saturate(S + D)
multiplyeMultiplies the color and alpha channels of the drawable with those of the tint. [Sa * Da, Sc * Dc]
screenf[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
src_atop9The tint is drawn above the drawable, but with the drawable’s alpha channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc]
src_in5The tint is masked by the alpha channel of the drawable. The drawable’s color channels are thrown out. [Sa * Da, Sc * Da]
src_over3The tint is drawn on top of the drawable. [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]


레이아웃

저자는 multiply tintMode에 관해서 API 별 색상 오버레이를 보여주기 위해서 다음과 같이 배치하였다.
res/layout/activity_main.xml 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.tistory.whiteduck.tinttest.MainActivity">

<TextView
android:id="@+id/src_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="src" />

<ImageView
android:id="@+id/image_src"
android:layout_width="100dp"
android:layout_height="120dp"
android:layout_below="@id/src_text"
android:src="@mipmap/ic_launcher"/>

<TextView
android:id="@+id/tint_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="tint"
android:layout_below="@id/image_src"/>

<ImageView
android:layout_width="100dp"
android:layout_height="120dp"
android:layout_below="@id/tint_text"
android:src="@drawable/drawable_tint"/>

</RelativeLayout>





결과


Android API level 19 - Kitket

 Android API level 21 - Lollipop

 Android API level 22 - Lollipop

 

 

 




참조 : http://toastdroid.com/2014/12/06/tinting-drawables-on-lollipop/


저작자 표시 비영리 변경 금지
신고

'Android Story' 카테고리의 다른 글

[ Android ] JavaCV 연동  (0) 2017.03.30
[ Android ] 틴트(오버레이) 색상 지정하기  (0) 2017.03.28
[ Android ] 줄번호 설정  (0) 2017.01.13
[ Android ] FFmpeg Rtsp Player 사용하기  (6) 2016.12.27
[ Android ] Network type  (0) 2016.12.19
[ Android ] FFplay 문서 번역  (0) 2016.12.13

Comment +0

티스토리 툴바