http://www.androidpub.com/1294511
http://neoroid.tistory.com/entry/%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%9B%EC%9D%80-pdf-%EB%82%98-apk-%ED%8C%8C%EC%9D%BC-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0
http://sdop.egloos.com/3630690
http://www.androidpub.com/1294511
http://neoroid.tistory.com/entry/%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%9B%EC%9D%80-pdf-%EB%82%98-apk-%ED%8C%8C%EC%9D%BC-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0
http://sdop.egloos.com/3630690
package com.innoace.test.install;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
public class APKInstall extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File apkFile = new File("/sdcard/FileBrowser.apk");
Uri apkUri = Uri.fromFile(apkFile);
Log.i("APKInstall", "Set apk path");
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType( Uri.fromFile(apkFile), "application/vnd.android.package-archive");
startActivity(intent);
Log.i("APKInstall", "APK installed");
} catch (Exception e) {
// TODO: handle exception
Log.i("APKInstall", e.getMessage());
}
// PackageManager pm = getPackageManager();
// pm.installPackage(apkUri);
}
}
http://www.androidpub.com/96985
http://android.amberfog.com/?p=98
/**
* Indicates whether the specified action can be used as an intent. This
* method queries the package manager for installed packages that can
* respond to an intent with the specified action. If no suitable package is
* found, this method returns false.
*
* @param context The application's environment.
* @param action The Intent action to check for availability.
*
* @return True if an Intent with the specified action can be sent and
* responded to, false otherwise.
*/
public static boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list =
packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
http://android-developers.blogspot.kr/2009/01/can-i-use-this-intent.html
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
final boolean scanAvailable = isIntentAvailable(this,
"com.google.zxing.client.android.SCAN");
MenuItem item;
item = menu.findItem(R.id.menu_item_add);
item.setEnabled(scanAvailable);
// 사용 불가능 할 때 disable
return super.onPrepareOptionsMenu(menu);
}
찾아보니 카카오톡에서도 이와 비슷한 코드를 사용하였네요.
String KakaoLinkURLBaseString = "kakaolink://sendurl";
public boolean isAvailableIntent() {
Uri kakaoLinkTestUri = Uri.parse(KakaoLinkURLBaseString);
Intent intent = new Intent(Intent.ACTION_SEND, kakaoLinkTestUri);
List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (list == null)
return false;
return list.size() > 0;
}
// 이건 참고용
public boolean isAvailableIntent(String url) {
System.out.println("isAvailableIntent = " + url);
Uri LinkTestUri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, LinkTestUri);
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if( list != null) {
for(int i = 0 ; i < list.size(); i++){
ResolveInfo info = list.get(i);
System.out.println(info.activityInfo);
}
}
return list.size() > 0;
}
어플 정보 가져오기
private void showShareAvailableApps() {
final PackageManager packageManager = this.getApplicationContext().getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo info : list) {
String appActivity = info.activityInfo.name;
String appPackageName = info.activityInfo.packageName;
String appName = info.loadLabel(packageManager).toString();
Drawable drawable = info.activityInfo.loadIcon(packageManager);
Logger.d(TAG, "appName : " + appName + ", appActivity : " + appActivity
+ ", appPackageName : " + appPackageName);
}
}
http://www.shop-wiz.com/board/main/view/root/java01/50/0/1
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class SimpleMapSortTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> addr = new HashMap<String, String>();
addr.put("다","1");
addr.put("가","2");
addr.put("나","3");
addr.put("라","4");
Set<String> set = addr.keySet();
Object []hmKeys = set.toArray();
Arrays.sort(hmKeys, keyStringSort); // 키값 정렬하기
for(int i = 0; i < hmKeys.length; i++)
{
String key = (String)hmKeys[i];
System.out.println(key);
}
}
public static Comparator<Object> keyStringSort = new Comparator<Object>() {
public int compare(Object s1, Object s2) {
String ss1 = (String)s1;
String ss2 = (String)s2;
return (-1) * ss2.compareTo(ss1);
}
};
}
############# result
가
나
다
라
DisplayMetrics displayMetrics = new DisplayMetrics(); |
http://show.ideatree.kr/pages/?board_content_idx=2854
http://blog.naver.com/PostView.nhn?blogId=shuiky&logNo=10045324570&viewDate=¤tPage=1&listtype=0
최근 카드번호가 '6' 으로 시작되는 카드가 발행되기 시작했습니다. 해당카드는 중국은련카드로 중국의 은행들이 연합하여 발행하는 신용카드입니다. 일본의 JCB, 한국의 BC카드와 같은 형태라 할 수 있습니다. 우리나라에서는 BC카드와 제휴하여 BC카드에서 카드를 발행하기 시작했군요.
신용카드번호를 살펴 보면 재미있는 사항들을 알 수가 있습니다. 신용카드번호의 체계에 대해서 최근 언론에 보도되고 있어서 간단하게 요약 정리해 보겠습니다.
아래 내용을 보시면 전세계가 공통적인 방식으로 카드번호 체계를 공유하고 있기 때문에 우리나라에서만 그 체계를 변경한다는 것은 현실적으로 불가능 합니다. 단, 국내전용카드(Local Card)의 경우에는 발급은행(발급사)에서 임의로 그 체계를 정할 수 있습니다.
16자리/13자리/14자리/15자리등 다양한 번호가 사용되지만, 일반적인 16자리 번호를 기준으로 설명하겠습니다.
○ 신용카드번호 첫1자리 : 카드브랜드
4 : VISA카드
5 : Master카드
3 : JCB, 아멕스, 다이너스 등 (아멕스카드는 15자리, 다이너스는 14자리) ※ 일반적으로 JCB로 보면 됩니다.
6 : 이면 중국은련카드
9 : Local카드 (국내전용카드)
※ 기타 1과 2로 시작되는 신용카드가 있는데 요즘은 발급되지 않고 있습니다.
○ 신용카드번호 첫6자리 : Bin번호 (Bank Identifier Number)
전세계적으로 발행기관(은행/카드사등)을 인식할 수 있는 번호
본 번호를 카드대분류(일반/특별/법인/Check카드 등)로 사용하여 카드번호만으로 카드종류를 인식할 수 있도록많이 사용합니다. 각 발급기관별로 수개에서 수십개의 Bin번호를 가지고 있으며, 발급기관이 각 카드브랜드(비자,마스타등)에 신청하여 그 번호를 부여받고 카드발급을 합니다.
○ Bin번호를 제외한 9자리
발행기관의 일련번
(보통 첫자리는 발행기관별로 카드대분류로 사용하는 경우가 많습니다.)○ 맨 마지막 자리 : Check Digit (검증번호)
위에 언급한 VISA/MSATER/JCB등 국제카드는 전부 다음과 같은 형식의 검증번호 체계를 따르게 되어 있습니다.
예시번호 : 4 5 1 8 4 3 4 0 0 2 0 7 6 6 0 0
4 5 1 8 4 3 4 0 0 2 0 7 6 6 0 0
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
-------------------------------------------------------
8 5 2 8 8 3 8 0 0 2 0 7 12 6 0
Dialog
다이얼로그 버튼 확인,취소 디자인 적용
(dlg.findViewById(android.R.id.button1)).setBackgroundResource(R.drawable.control_button_basic);
(dlg.findViewById(android.R.id.button2)).setBackgroundResource(R.drawable.control_button_cancel);
android.R.id.button1
for positive,
android.R.id.button2
for negative,
android.R.id.button3
for neutra
ContextThemeWrapper ctw = new ContextThemeWrapper( this, R.style.AlertDialogCustom);
AlertDialog.Builder builder= new AlertDialog.Builder( ctw );
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AlertDialogCustom" parent="@android:style/AlertDialog">
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
<item name="android:textSize">10sp</item>
</style>
</resources>
웹뷰에서 callback 사용시 proguard 적용하기
JavascriptCallback.java
public interface JavascriptCallback {
public void WebCallBack();
public void WebCallback(String a, String b, String c);
}
인터페이스 하나 만들고
웹뷰
WebView.java 에서는
wvContents.addJavascriptInterface(new JavascriptInterface(), "Event");
public class JavascriptInterface implements JavascriptCallback {
public void WebCallBack() {
// TODO
}
public void WebCallBack(String a, String b, String c) {
// TODO
}
}
proguard 에서는
-keep public class YOURPACKAGENAMEHERE.JavascriptCallback
-keep public class * implements YOURPACKAGENAMEHERE.JavascriptCallback
-keepclassmembers class * implements YOURPACKAGENAMEHERE.JavascriptCallback {
<methods>;
}
http://stackoverflow.com/questions/7424510/uncaught-typeerror-when-using-a-javascriptinterface
프로가드 멀고도 험하게 적용했다.
호출은
window.Event.WebCallBack();