펌 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



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


1.구버전 안드로이드 기본브라우저 (약 S5 이전단말의 기본브라우저)


try {

String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL};

String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; // 0 = history, 1 = bookmark

Cursor mCur = getContentResolver().query(Browser.BOOKMARKS_URI, proj, sel, null, null);

mCur.moveToFirst();

String title = "";

String url = "";


if (mCur.moveToFirst() && mCur.getCount() > 0) {

boolean cont = true;

while (mCur.isAfterLast() == false && cont) {

title = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.TITLE));

url = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.URL));

mCur.moveToNext();

      }


}

}

catch (Exception e) {

}



2. 크롬 브라우저


try {

String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL, Browser.BookmarkColumns.DATE };

Uri uriCustom = Uri.parse("content://com.android.browser/bookmarks");

String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; // 0 = history, 1 = bookmark

Cursor mCur = getContentResolver().query(uriCustom, proj, sel, null, null);

mCur.moveToFirst();

String title = "";

String url = "";


if (mCur.moveToFirst() && mCur.getCount() > 0) {

boolean cont = true;

while (mCur.isAfterLast() == false && cont) {

title = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.TITLE));

url = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.URL));


        }

mCur.moveToNext();

      }


}

}

catch (Exception e) {

}


3. 최신단말의 안드로이드 S브라우저 (약 S5이후 단말에서 많이 사용하는것같음)


try {

String[] proj = new String[] { Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL, Browser.BookmarkColumns.DATE };

Uri uriCustom = Uri.parse("content://com.sec.android.app.sbrowser.browser/bookmarks");

String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; // 0 = history, 1 = bookmark

Cursor mCur = getContentResolver().query(uriCustom, proj, sel, null, null);

mCur.moveToFirst();

String title = "";

String url = "";


if (mCur.moveToFirst() && mCur.getCount() > 0) {

boolean cont = true;

while (mCur.isAfterLast() == false && cont) {

if (!TextUtils.isEmpty(url)) {

title = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.TITLE));

url = mCur.getString(mCur.getColumnIndex(Browser.BookmarkColumns.URL));


}

mCur.moveToNext();

      }


}

}

catch (Exception e) {

}



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



public Boolean isServiceRunning(String serviceName) {

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

for (RunningServiceInfo runningServiceInfo :                                                   activityManager.getRunningServices(Integer.MAX_VALUE)) {

if (serviceName.equals(runningServiceInfo.service.getClassName())) {

return true;

   }

}

return false;

}


serviceName : 매니패스트에서 설정한 서비스의 이름.


ex ) <service android:name="com.biig.tistory.service.BiigService" >

에서 String serviceName = "com.biig.tistory.service.BiigService";



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


Uri uri = Uri.fromParts("package", "패키지명", null);

Intent delIntent = new Intent(Intent.ACTION_DELETE, uri);

startActivity(delIntent);


메소드를 하나 만들어서 패키지명을 인자로 넘겨받으면


입력값으로 넘어온 패키지를 삭제할 수 있다.


바로 삭제가 되는것이 아니라, 삭제가 가능한 화면을 띄워주는것이다.


어플단에서 바로 삭제처리하는것은 일반적으로 불가능하다고 보면 된다.



설치된 패키지 정보를 보는 방법은 이전 포스팅을 보면 된다.



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




private void getPackageList() {

PackageManager pm = this.getPackageManager();


List<PackageInfo> packs =                   getPackageManager().getInstalledPackages(PackageManager.PERMISSION_GRANTED);

Log.i("TAG", "===================================================");

for (PackageInfo pack : packs) {

Log.d("TAG", "| name    : " + pack.packageName);

      Log.d("TAG", "| package : " + pack.packageName);

      Log.d("TAG", "| version : " + pack.versionName);

}

Log.i("TAG", "===================================================");

}



휴대폰에 설치 된 패키지명과 어플명, 버전을 가져온다.



public void onRemovePackage(String removePackage) {

Uri uri = Uri.fromParts("package", removePackage, null);

Intent intent = new Intent(Intent.ACTION_DELETE, uri);

startActivity(intent);

}


removePackage로 받아 온 패키지명의 어플을 삭제하겠냐는 팝업이 나타나고, 해당 패키지를 삭제한다.


호출은 


onRemovePAckage("com.example.test");




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


패키지명을 입력하면 설치 여부를 알려주는 소스코드


PackageInfo pi;  

try {

String strAppPackage = "패키지명 (ex : com.exam.googlemap)";

pi = getPackageManager().getPackageInfo(strAppPackage,  PackageManager.GET_ACTIVITIES);

}

catch (PackageManager.NameNotFoundException e) {

//패키지가 설치되지 않음

}


버전을 구하고싶다면


String str = pi.versionName;




Android/소스코드 | Posted by 덩치 2014. 3. 26. 13:21

화면캡쳐 방지 소스코드

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

어플 화면이 캡쳐되지 않도록 해달라는 요청을 받고 검색하다가 발견한 소스코드.


불가능할줄 알았는데 api level 1부터 이런게 있었다니 .. 충격


getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);


정확한 원리는 모르겠는데 몇몇 기종으로 테스트 해 본 결과


어떤 폰에서는 캡쳐기능을 사용할 수 없습니다 라는 토스트를 출력하고


어떤 폰에서는 캡쳐 직전 바로 검은 화면을 띄워서 해당 화면이 캡쳐되도록 하는 듯 하다.



위 코드 한줄만 넣어주면 적용 완료.


특정 영역에서만 캡쳐를 방지하고싶다면, 이외의 영역에는

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);

를 추가하면 된다.


참고로 액티비티가 액티브되고 있는 상태에서만 적용. 즉 홈화면으로 나가서 캡쳐를하면 제대로 캡쳐가 된다.


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



startActivity(new Intent(android.provider.Settings."액션"));


한줄만 넣어주면 원하는 설정창을 띄워줄 수 있다.


예를들어 GPS설정창을 띄우고 싶은 경우


startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));


데이터네트워크 설정창을 띄우고 싶은 경우


startActivity(new Intent(android.provider.Settings.ACTION_DATA_ROAMING_SETTINGS));



이외에도 Settings 하위에 액션들이 많으니 필요한 액션을 찾아서 적용시켜주면 유용하게 쓰일듯 하다.




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


작업을 하다가 바이트로 저장된 .dat파일을 수정할 일이 생겼다.


아예 파일을 다시 생성해버릴까 하다가 멘탈을 다잡고 생각해 보니 생각보다 간단한문제였다.


먼저 파일을 열어야 하는데


static public byte [] openUploadPacket(Context ctx, String name) {

String filename = name + "_packet.dat" ;

byte [] list = null ;

try {

File cellFile = ctx.getFileStreamPath(filename);

ObjectInputStream is = new ObjectInputStream(new FileInputStream(

cellFile));

list = (byte []) is.readObject();

is.close();

return list;

} catch (Exception e) {

log.err("openUploadPacket = " + e) ;

return null;

}

}


이렇게하면 바이트배열에 파일의 내용이 전부 들어간다.


( 파일을 저장하는것은 InputStream 대신 OutputStream을 사용해서 write해주면 된다. )



나는 오픈한 파일의 164 ~ 175 번 값을 바꿔줘야 했다.



byte [] packet = Common.openUploadPacket(mContext, workNum) ;

byte [] editByte = et_nis.getText().toString().getBytes();


for (int i = 0; i < editeByte.length; i++) {

packet [164 + i] = editeByte[i];

}


먼저 바이트배열 packet에 파일 읽어온다

그럼 파일의 length만큼 배열크기가 할당되고 데이터가 들어가고,


내가 수정할 데이터가 들어갈 editByte도 하나 만들어줬다.


et_nis라는 EditView에 입력한 값이 저기에 들어가게 될텐데,


et_nis에 어떤 데이터형이 들어갈 지 모르기때문에 일단 스트링으로 받은 다음, getBytes()를 이용해

바이트형식으로 배열에 넣어줬다.


그리고 164번부터 et_nislength만큼 반복을 돌려서 기존 packet 배열에 수정할 데이터 배열을 넣어준다


위와같이 하면 원하는 길이만큼 원하는 데이터로 수정해 줄 수 있다.


소켓통신할 때 자주 사용될 것 같다