안드로이드 MIME타입 떄문에 요즘 머리아픕니다. ㅠㅠ  공부해야쥐 ㅠㅠ

 

안드로이드 확장자로 mime 타입 추출하는 방법

        

          MimeTypeMap mtm = MimeTypeMap.getSingleton(); // mime type 추출용

      // 파일의 이름을 제외한 확장자명 추출
          String fileExtension = str.substring(str.lastIndexOf(".") + 1, str.length()).toLowerCase();           

     //확장자를 통해 String 형태로 Mime타입 추출
          String mimeType = mtm.getMimeTypeFromExtension(fileExtension);

 

이상입니다.

 

Screen Density, DPI

 

Density 

DPI 

Layout 경로 

Drawable 경로 

 Low

120

/res/layout-ldpi

/res/drawable-ldpi

 Medium

 160

 /res/layout-mdpi

/res/drawable-mdpi

 High

 240

 /res/layout-hdpi

/res/drawable-hdpi

 Extra high

 320

 /res/layout-xhdpi

/res/drawable-xldpi

 

1. 실행아이콘 크기

해상도(Screen density) 

크기(픽셀) 

Low 

36 x 36

 Medium

 48 x 48

 High

 72 x 72

 Extra high

 96 x 96

 

2. 액션바 아이콘 크기

 

 

Low

18 x 18

Medium

24 x 24

High

36 x 36

Extra high

48 x 48

 

 

3. 상태바 아이콘 크기

해상도(Screen density)

크기(픽셀)

Low

18 x 18

Medium

24 x 24

High

36 x 36

Extra high

48 x 48

 

4. 대화상자 아이콘 크기

해상도(Screen density)

크기(픽셀)

Low

18 x 18

Medium

24 x 24

High

36 x 36

Extra high

 

5. 리스트뷰 아이콘 크기

해상도(Screen density)

크기(픽셀)

Low

18 x 18

Medium

24 x 24

High

36 x 36

Extra high

 

6. 탭아이콘 크기

해상도(Screen density)

크기(픽셀)

Low

24 x 24

Medium

32 x 32

High

48 x 48

Extra high

 

그 외 고해상도 앱인 경우 구글마켓 등록 시 고해상도 아이콘을 추가 해야 함 : 512 x 512 픽셀

참고사이트 : http://www.creativefreedom.co.uk/icon-designers-blog/android-app-icon-sizes/

 

안드로이드 갤러리(S메모) 공유 받는방법입니다.

 

개발을 하다보니 S메모의 내용을 받으려고 헤메고 다녀서 정리 해둡니다.

 

우선 공유를 받게 되면 기본적으로 URI 형태로 받을수 있습니다.

자 그럼 손을 대야하는곳은

AndroidManifest.xml 와 실제 구동할 Activity 입니다.

 

우선 AndroidManifest.xml입니다

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hjm.shear.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>

            <intent-filter

                  android:label ="원하는이름">
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*" />
            </intent-filter>            

         </activity>
    </application>

</manifest>

 

빨간 부분이 추가되어야 합니다.

 

다음은 Activity 부분입니다.

 

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//실제액티비티에서 인텐트를 받습니다.

 

         Intent intent = getIntent();

        Bundle extras = intent.getExtras();

//저갔은 경우는 그냥 이미지뷰에 넣었습니다. 참고로 예외처리 안했습니다. ㅋㅋ

 

        ImageView imageview = (ImageView)findViewById(R.id.imgv);

        Uri uri = (Uri) extras.getParcelable(Intent.EXTRA_STREAM); //이게 URI입니다.

//이것이 필요한거구요  


        if(!uri.equals("")){
         String[] proj = { MediaStore.Images.Media.DATA };
           Cursor cursor = managedQuery(uri, proj, null, null, null);
           int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           cursor.moveToFirst();
         String  path = cursor.getString(index);
           path = path.substring(5);
//path 이게 URI를 갖고 파일경로 알아냅니다. 

 

            imageview.setImageURI(uri); 
        }
       
    }   
}

 

Android에서 Toast를 사용할 때, 메시지가 중복해서 뜨면서 오랫동안 지속되는 경우가 있습니다.

기존 메시지는 삭제하고, 현재 메시지만 보이도록 하는 방법을 공유합니다.

 

1. Toast 객체 선언
public static Toast mToast;

2. onCreate() 에서 Toast.makeText()를 이용하여 Toast 객체 초기화
mToast = Toast.makeText(this, "null", Toast.LENGTH_SHORT);

3. 이 후, Toast를 보여주는 코드에 있는 Toast.makeText().show() 대신 다음으로 변경
mToast.setText(
show this text);

mToast.show();

 

이렇게 수정하면,

l mToast가 보여지지 않던 상황에는, 설정한 string toast를 띄우게 되고,

l mToast가 보여지고 있던 상황에는, mToast에 보여지고 있던 text를 새로운 text로 변경하여 보여줍니다.

항상 가장 마지막에 setText(), show() 했던 text Toast에 보여지게 되며, Toast.LENGTH_SHORT 만큼의 시간이 흐른뒤에 Toast가 사라지게 됩니다.

 

 

 

private SharedPreferences _prefs = null;

// SharedPreferences => 환경설정파일 생성하고 관리하기 위한 클래스

SharedPreferences 객체 생성방법

context.getSharedPreferences("PREFS_PRIVATE", Context.MODE_PRIVATE);
// SharedPreferences 객체를 얻기위한 메소드
// "파일명", 파일에 접근할 수 있는 권한
// <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
// <map> </map>

private Editor _editor = null;

// Editor => 환경설정파일의 내용을 수정하기 위한 클래스

Editor 객체 생성방법

SharedPreferences.edit();// Editor 객체를 얻기 위한 메소드

SharedPreferences 가 보유하고 있는 값 추출하는 메서드

SharedPreferences.getString("emailaddress", "Unknown");
// getString() 의 첫번째 값은 ~~.xml에서 <string name="~~">
// getString() 의 두번째 값은
<string>값이 없을 경우 기본값 </string>

SharedPreferences에 값을 넣거나 수정하는 메서드

Editor.putString("emailaddress", newemail);
// putString() => <string></string>
// putString()의 첫번째 값 => <string name="~~~">
// putString()의 두번째 값 => <string>~~~~</string>
// <string name="emailaddress">newemail변수의 값</string>

새로운 값, 변경 내용을 SharedPreferences에 실제로 적용시키는 메서드

Editor..commit();
// this._editor에 보관되어 있는
// <string name="emailaddress">newemail변수의 값</string>
// <string name="serverurl">serverurl변수의 값</string>
// 를 SharedPreferences xml 파일에 적용시키는 메소드

실제 사용한 예

/*
* prefs.java Unlocking Android http://manning.com/ableson Author: W. F. Ableson
* fableson@msiservices.com
*/

package com.msi.manning.UnlockingAndroid;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

public class Prefs {

private SharedPreferences _prefs = null;
// SharedPreferences => 환경설정파일 생성
private Editor _editor = null;
// Editor => 환경설정파일의 내용을 수정
private String _useremailaddress = "Unknown";
private String _serverurl = "http://android12.msi-wireless.com/getjoblist.php";

public Prefs(Context context) {
this._prefs = context.getSharedPreferences("PREFS_PRIVATE", Context.MODE_PRIVATE);
// SharedPreferences 객체를 얻기위한 메소드
// "파일명", 파일에 접근할 수 있는 권한
// <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
// <map> </map>
this._editor = this._prefs.edit();
// Editor 객체를 얻기 위한 메소드
}
// getValue() => SharedPreferences파일의 내용을 얻기 위한 메소드
public String getValue(String key, String defaultvalue) {
if (this._prefs == null) {
return "Unknown";
}

return this._prefs.getString(key, defaultvalue);
}
// setValue() => SharedPreferences파일에 내용을 저장 위한 메소드
public void setValue(String key, String value) {
if (this._editor == null) {
return;
}

this._editor.putString(key, value);

}
// getEmail() => 계정을 추출하는 메서드
public String getEmail() {
if (this._prefs == null) {
return "Unknown";
}

this._useremailaddress = this._prefs.getString("emailaddress", "Unknown");
// getString() 의 첫번째 값은 ~~.xml에서 <string name="~~">
// getString() 의 두번째 값은 <string>값이 없을 경우 기본값 </string>
return this._useremailaddress;
}
// getServer() => 접속할 URL 주소를 추출하기 위한 메소드
public String getServer() {
if (this._prefs == null) {
return "http://android12.msi-wireless.com/";
}

this._serverurl = this._prefs.getString("serverurl", "http://android12.msi-wireless.com/");
return this._serverurl;
}
// setEmail(입력된 사용자계정) =>입력된 사용자계정을 저장하는 메서드
public void setEmail(String newemail) {
if (this._editor == null) {
return;
}

this._editor.putString("emailaddress", newemail);
// putString() => <string></string>
// putString()의 첫번째 값 => <string name="~~~">
// putString()의 두번째 값 => <string>~~~~</string>
// <string name="emailaddress">newemail변수의 값</string>
}
// setServer(입력된 URL주소) => 입력된 URL주소를 저장하는 메소드
public void setServer(String serverurl) {
if (this._editor == null) {
return;
}
this._editor.putString("serverurl", serverurl);
// putString() => <string></string>
// putString()의 첫번째 값 => <string name="~~~">
// putString()의 두번째 값 => <string>~~~~</string>
// <string name="serverurl">serverurl변수의 값</string>
}
// save() => 실제로 ~~.xml 파일에 저장하는 메소드
public void save() {
if (this._editor == null) {
return;
}
this._editor.commit();
// this._editor에 보관되어 있는
// <string name="emailaddress">newemail변수의 값</string>
// <string name="serverurl">serverurl변수의 값</string>
// 를 SharedPreferences xml 파일에 적용시키는 메소드
}
}

실습예제

프로젝트 새롭게 만들고, 메인화면에 아래와 같이 구성...

ToggleButton => 사운드 (기본값 : On)
EditText => 아이디 (기본값 : default)
EditText => 비밀번호 (기본값 : default)

CheckBox => 아이디저장 (기본값 : 체크해제)
CheckBox => 비밀번호저장 (기본값 : 체크해제)

Button => 확인

확인버튼을 누르면 SharedPreferences 파일에

현재 사운드의 On/Off 상태 값, 체크박스에 체크한 값들은 (아이디, 비밀번호) 저장할 수 있도록 코드 작성....
(단, 다시 어플리케이션을 실행하면 현재 SharedPreferences 파일에

저장된 값으로 실행되어야 함..)

안드로이드 개발 중 가끔 다른 앱과 연동해야하는경우 !!!

그 앱이 설치 되어있는지 확인해야할 경우가있습니다.

그럴경우 이렇게 사용하세요

 

 

//패키지 매니저

  PackageManager pm = getPackageManager();
            try {
             //검색할 대상 패키지명
                 pm.getApplicationInfo("검색할 패키지명",PackageManager.GET_META_DATA);
                 }catch (Exception e)
                {
                 //패키지가 없을경우 실행할 내용
                 }

 

혹은

 

PackageManager mPm = getPackageManager();
List<android.content.pm.ApplicationInfo> mInstalledPkgList = mPm.getInstalledApplication(PackageManager.GET_UNINSTALLED_PACKAGES);
         for( android.content.pm.ApplicationInfo appFmc : mInstalledPkgList )
         {
            if(appFmc.packageName.equals("검색할 패키지명"))
             {//설치시
              Check = true;
             }
         }
         if(!Check)

  {
             //미설치시 
  }
   

키이벤트 다른것 찾다가 나중에 유용하게 쓰일것 같아서 가져왔습니다. ㅋ

=========================================================================================================


하드웨어 키를 누른 효과를 프로그래밍 내에서 인위적으로 발생시킨다. 


import android.app.Activity;

import android.app.Instrumentation;

import android.os.Bundle;

import android.os.Handler;

import android.view.KeyEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;


public class Test extends Activity {

 

 /** Called when the activity is first created. */

 @Override

 public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);


  setContentView(R.layout.main);

  Button btn = (Button) findViewById(R.id.btn);

  btn.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {

    new Thread(new Runnable() {         

        public void run() {                 

            new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_VOLUME_UP);

        }   

    }).start();

   }

  });

 }

}


[출처] Android KeyEvent 강제 발생 ( Instrumentation keyCode )|작성자 아즈라엘


안드로이드 드바이스 정보 보기

 

public class ModelNameTest extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 
 Log.d("ModelNameTest", "BOARD: " + Build.BOARD);
        Log.e("Device Info", "BRAND: " + Build.BRAND);
        Log.e("Device Info", "CPU_ABI: " + Build.CPU_ABI);
        Log.e("Device Info", "DEVICE: " + Build.DEVICE);
        Log.e("Device Info", "DISPLAY: " + Build.DISPLAY);
        Log.e("Device Info", "FINGERPRINT: " + Build.FINGERPRINT);
        Log.e("Device Info", "HOST: " + Build.HOST);
        Log.e("Device Info", "ID: " + Build.ID);
        Log.e("Device Info", "MANUFACTURER: " + Build.MANUFACTURER);
        Log.e("Device Info", "MODEL: " + Build.MODEL);
        Log.e("Device Info", "PRODUCT: " + Build.PRODUCT);
        Log.e("Device Info", "TAGS: " + Build.TAGS);
        Log.e("Device Info", "TIME: " + Build.TIME);
        Log.e("Device Info", "TYPE: " + Build.TYPE);
        Log.e("Device Info", "USER: " + Build.USER);
    }
}

 

안드로이드 설정된 언어 판단하기 !!!

 

getResources().getConfiguration().locale.getDisplayLanguage();

이방법은 실제로 유저가 언어를 선택할때 보여지는 언어명입니다.

예를 들어 한국어, English,中文 이렇게 말입니다.

 

 

getResources().getConfiguration().locale.getDefault().getLanguage();

이방법은 실제로 유저가 보는 부분은 아닙니다.

예를 들어

한국어 = ko

English = en

과 같이 개발자가 쓰기에 적당합니다.

 

사용해본결과 레이아웃 판단은 getResources().getConfiguration().locale.getDefault().getLanguage();

 

이것을 사용하는것 같더라구요.

 

참고하세요~

StringTokenizer
String a = 123456-654321;
StringTokenzier st = new StringTokenzier(a,"-");
String a1 = st.nextToken();
String a2 = st.nextToken();

a1 -> 123456

a2 -> 654321

단 중간에 null 이면 오류납니다.


split

a=123456-1234567

String[] arr = a.split("-");

 

등이 있네요