몇 가지 링크
location
두 점사이의 거리를 계산하는 다양한 방법
https://readyandroid.wordpress.com/calculate-distance-between-two-latlng-points-using-google-api-or-math-function-android/
public static String getDistance(LatLng latlngA, LatLng latlngB) {
Location locationA = new Location("point A");
locationA.setLatitude(latlngA.latitude);
locationA.setLongitude(latlngA.longitude);
Location locationB = new Location("point B");
locationB.setLatitude(latlngB.latitude);
locationB.setLongitude(latlngB.longitude);
float distance = locationA.distanceTo(locationB)/1000;//To convert Meter in Kilometer
return String.format("%.2f", distance);
}
public static String getDistance(float lat_a, float lng_a, float lat_b, float lng_b) {
// earth radius is in mile
double earthRadius = 3958.75;
double latDiff = Math.toRadians(lat_b - lat_a);
double lngDiff = Math.toRadians(lng_b - lng_a);
double a = Math.sin(latDiff / 2) * Math.sin(latDiff / 2)
+ Math.cos(Math.toRadians(lat_a))
* Math.cos(Math.toRadians(lat_b)) * Math.sin(lngDiff / 2)
* Math.sin(lngDiff / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double distance = earthRadius * c;
int meterConversion = 1609;
double kmConvertion = 1.6093;
// return new Float(distance * meterConversion).floatValue();
return String.format("%.2f", new Float(distance * kmConvertion).floatValue()) + " km";
// return String.format("%.2f", distance)+" m";
}
private double distance(double lat1, double lon1, double lat2, double lon2) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1))
* Math.sin(deg2rad(lat2))
+ Math.cos(deg2rad(lat1))
* Math.cos(deg2rad(lat2))
* Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
return (dist);
}
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
menu의 showAsAction 의 flags
<item
android:id="@+id/action_xxx"
android:orderInCategory="2"
android:showAsAction="never"
android:checkable="true"
android:title="선택 메뉴"/>
- showAsAction의 flag들
never : 절대로 액션바에 표시하지 않습니다 (기본값)
ifRoom : 표시할수 있는 공간이 존재하면 표시합니다
withText : 메뉴의 아이콘과 텍스트를 함께 표시합니다
always : 항상 액션바에 표시합니다
최상위 태스크 확인
아래의 권한은 deprecate되었다. 사용할 수 없는게 아니고, 권한 설정을 안해도 된다.
<uses-permission android:name="android.permission.GET_TASKS" />
getRunningTasks()는 시스템에 어떤 액티비티들이 실행중인지를 조회하는 함수인데, 보안상 문제가 있다. 그래서 자기 자신에 대한 것만 조회되도록 기능이 변경되었고, 따라서 권한 부여가 필요없어진 것 같다.
API 21(Lolipop) 이상 버전부터 ActivityManager의 getRunningTasks() 메서드가 deprecated 되었다
API 23(Mashmallow) 이상 버전부터 getRunningAppProcesses()와 getRunningServices()또한 자신만을 반환하도록 변경되었다
잘 쓰던 AndroidProcesses 라이브러리도 API 25(Naugat) 버전부터 작동하지 않게되었다
UsageStatsManager를 사용하면 Foreground Process들을 가져올 수 있다
시스템 권한을 필요로한다
private String getForegroundPackageName() {
String packageName = null;
UsageStatsManager usageStatsManager = (UsageStatsManager)getSystemService(Context.USAGE_STATS_SERVICE);
final long endTime = System.currentTimeMillis();
final long beginTime = endTime - 10000;
final UsageEvents usageEvents = usageStatsManager.queryEvents(beginTime, endTime);
while (usageEvents.hasNextEvent()) {
UsageEvents.Event event = new UsageEvents.Event();
usageEvents.getNextEvent(event);
if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
packageName = event.getPackageName();
}
}
return packageName;
}
커스텀 퍼미션 이해
https://developer.android.com/guide/topics/permissions/defining
https://codechacha.com/ko/android-define-custom-permission/
노티피케이션 메시지 업데이트 하기
https://stuff.mit.edu/afs/sipb/project/android/docs/training/notify-user/managing.html
스프링 애니메이션
https://developer.android.com/guide/topics/graphics/spring-animation
유용한 라이브러리
안드로이드 텍스트뷰에 Markdown 적용(웹뷰 없이) https://github.com/noties/Markwon