펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



간단하게 아래와 같이 하면 된다.


Bitmap bitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.share_img);



펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



비트맵, 파일이 저장될 경로, 저장할 파일명을 넘겨받아서


JPEG 파일로 저장하는 방법이다.


public static void SaveBitmapToFileCache(Bitmap bitmap, String strFilePath, String filename) {


File file = new File(strFilePath);


if (!file.exists())

file.mkdirs();


File fileCacheItem = new File(strFilePath + filename);

OutputStream out = null;


try {

fileCacheItem.createNewFile();

out = new FileOutputStream(fileCacheItem);


bitmap.compress(CompressFormat.JPEG, 100, out);

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}





펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



매니페스트에 설정된 어플의 버전을 가져오는 방법이다.


직접적으로 매니페스트의 버전을 가져올 수 없기때문에


패키지매니저를 통해 자기자신 패키지명을 대입하여


설치정보를 가져오는 방식이다.


public static String getPackageVersion(Context context) {

try {

PackageInfo pi = context.getPackageManager()

.getPackageInfo(context.getPackageName(),

PackageManager.GET_UNINSTALLED_PACKAGES);

return pi.versionName;

}

catch(Exception e) {

}

return new String("");

}


예를들어 매니페스트의 버전이 android:versionName="1.0.0" 이라면


1.0.0을 리턴한다.


버전체크가 필요할때 주로 사용되는 방법이다.



펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



웹뷰 내용을 롱클릭 하면 블럭설정이 된다.


기본적으로 롱클릭리스너에서 false를 리턴하기때문인데


아래와 같이 true로 수정하면 블럭지정이 되지 않는다.



mWebView.setOnLongClickListener(new OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

return true;

}

});




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


Error:Apostrophe not preceded by  에러는


string.xml 파일에서 어퍼스트로피(') 문자를 잘못 사용하는 경우 발생한다.

그중에서도 문자열 내용에 특수문자가 포함되어있을경우 나타나는데

간단하게 문자열 양 끝에 " 를 붙여주면 해결된다. 

예를 들면

<string name="dialog_message">'테스트용' 문자열입니다.</string>


이를


<string name="dialog_message">"'테스트용' 문자열입니다."</string>


이렇게 바꿔주면 된다.


물론 메시지를 출력해도 " 문자는 출력되지 않는다.


다른 해결방법으로는


어퍼스트로피 앞에 \를 붙여주는것이다. 예를들면


<string name="dialog_message">\'테스트용\' 문자열입니다.</string>




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



LG단말같은 경우 디스플레이 내부에 소프트키(뒤로가기,메뉴,홈 등)가 존재한다.

이 경우 해상도를 따로 처리해줘야하는 경우가 있기에 찾아본 방법이다.


boolean hasMenuKey = ViewConfiguration.get(this).hasPermanentMenuKey();
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
if(!hasMenuKey && !hasBackKey) {
     Log.e("","no hasMenuKey");
} else {
     Log.e("","hasMenuKey"+hasMenuKey+" " +hasBackKey);
}



출처 : http://stackoverflow.com/questions/16092431/check-for-navigation-bar

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


이미지 크기를 절대값으로 주고 여러 단말에서 확인을 해 보면, 단말 해상도에 따라 이미지 크기가


제각각인 경우가 있다.


애초에 이미지를 선언할 때 xml에서 dp로 줘버리면 상관이 없겠지만(drawable 폴더에 제대로 분기했다는 가정 하에),


소스코드상에서 비트맵을 만들고, 그 이미지를 뿌리는 경우 참 애매하다.


이때 해상도별로 사이즈 설정을 통일되게 하는 방법에 대해 알아보자.


예를들어Height1280px인 단말기에서 알맞은 이미지 width28px, height28px 일 때,


이보다 높거나 낮은 해상도에서 그에 맞는 사이즈로 리사이징을 하기 위한 방법이다.


먼저 단말의 해상도를 구해야한다.


Drawable d = getResources().getDrawable(id);

DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

float deviceHeight = displayMetrics.heightPixels;


이렇게하면 deviceHeight 에는 단말의 Height 사이즈가 리턴된다.

(어떤 단말에서는 1280, 어떤 단말에서는 2500몇 .. 이런식으로)


int dp = (int) (28 * (deviceHeight / 1280));


여기서 281280은 위에서 예시를 든것과 같이


1280px의 해상도 단말에서 알맞게 표시되는 이미지 크기 28px을 뜻한다.


이렇게 하면 단말 해상도가 커지거나 작아져도 dp값이 그에 따라 커지고 작아져서


모든 단말에서 알맞은 사이즈로 이미지가 표시된다.


디테일을 요구하는 작업에서는 다른 필터링이 추가되어야하겠지만, 일반적인범위 내에서는


위 방법을 이용하면 사이즈가 알맞게 잘 표시가 되었다.




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO


이 포스팅에서 다루게 될 내용 :

1. Wi-Fi 주파수 추출법

2. 주파수에 다른 채널값 추출법




위 표는 IEEE 802.11b/g/n 2.4GHz 방식과 IEEE 802.11a/n 5GHz 방식의 표준을 나타낸 표이다.


쉽게 말해 일반적으로 말하는 2.4G 대역 와이파이와 5G 대역 와이파이의 주파수와 채널에 대한 정보이다.


먼저 연결된 Wi-Fi의 주파수를 검출하는 방법에 대해 알아보자.


주파수는 WifiManager를 이용하여 와이파이 스캔을 실시하고, 이 결과를 이용하여 추출하게 되는데 방법은 아래와 같다.


WifiManager mWM = (WifiManager) context.getSystemService(WIFI_SERVICE);

WifiInfo wifiInfo = mWM.getConnectionInfo();


try {

for (ScanResult scanResult : mWM.getScanResults()) {

if (wifiInfo != null && wifiInfo.getBSSID() != null

&& wifiInfo.getBSSID().equals(scanResult.BSSID)) {


mCurrentFrequency = scanResult.frequency;

break;

}

}

} catch (Exception e) {


}


주변 Wifi를 스캔하여 현재 연결된 WifiBSSID와 일치하는 와이파이의 주파수를 추출하고 있다.


이렇게 추출된 주파수와 채널값에는 일정한 규칙이 있다.


이 규칙을 공식으로 만들어 채널값을 계산할 수 있다.


방법은 아래와 같다.


public static int convertFrequencyToChannel(int freq) {

if(freq >= 2412 && freq <= 2484) {

if (freq == 2484)

return (freq-2412) /5;

return (freq-2412) /5 + 1;

}else if( freq >= 5170 && freq <= 5825) {

return (freq-5170) /5 + 34;

}

else {

return -1;

}

}


해당 계산식을 적용하면 표에 나와있는 채널값과 동일한 값이 얻어지는것을 확인 할 수 있다.


범위 확인중인 주파수 영역을 벗어나는 새로운 주파수가 추가된다면 소스코드의 수정이 필요할 수 있다.