안드로이드 기기 고유값 생성 방법입니다.

아래 소스를 사용하시면 기기 고유값을 사용 하실 수 있습니다.

하지만 제가 써본결과 항상 앱을 설치 했다 지웠다 해도 고유한 값은 아닌듯 합니다.

검색해본 결과 아래 방법이 최선인 듯 합니다만

혹시 다른 방법이나 제가 모르는 아래 소스에 대한 문제점이 있다고 하시면

댓글로 남겨주시면 감사 하겠습니다.


package util;

import java.util.UUID;
import android.content.Context;
import android.telephony.TelephonyManager;

//단말기 고유값 추출 클래스
public class UniqueDeviceID {
 
 public static String getUniqueID(Context context) {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        final String tmDevice, tmSerial, androidId;
        tmDevice = "" + tm.getDeviceId();
        tmSerial = "" + tm.getSimSerialNumber();
        androidId = "" + android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

        UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
        String deviceId = deviceUuid.toString();
        return deviceId;
    }
}

앱을 웹브라우저를 통해 실행시키고 데이터를 넘겨줄 수 있다. 

잘 이해가 안된다면 지금 스마트폰의 웹브라우저를 통해서 아래 링크를 클릭해보면 쉽게 이해할 수 있다.

 

*카카오톡이 설치되었다면 클릭 (이 블로그 url을 전송한다.)

 

1. 특정 URL을 사용한다고 선언

카카오톡의 경우 kakaolink:// 로 시작하며 그 뒤에 액션 및 파라미터를 추가하여 사용한다.

*카카오 링크 설명 : http://www.kakao.com/link/ko/api?tab=mobile

 

위 앱처럼 자신만의 url을 사용할 수 있게 해보자. 그러기 위해서는 manifest 파일에 선언해 주어야 한다.

액티비티 태그 안에 intent-filter를 추가하여 속성을 뷰여하자.

action은 View, category는 DEFAULT와 BROWSABLE.

 

여기까지는 url scheme를 사용하기 위한 준비이고 그렇다면 자신만의 url scheme를 등록해 보자.

마찬가리로 intent-filter에 data 를 추가한다. scheme는 http, daummaps, kakaolink 같은 프로토콜 부분이다. host는 www.daum.net과 같이 프로토콜 이후에 나오는 경로이다. 이 부분은 url을 사용하는 액티비티를 구분하던지, 동작형식을 구분하던지 자신에게 알맞는 용도로 사용하면 된다.


AndroidManifest.xml
<activity android:name=".BkCalculatorActivity" android:label="@string/title_activity_calc">
    <intent-filter>
        <action android:name="android.intent.action.VIEW">
        <category android:name="android.intent.category.DEFAULT">
        <category android:name="android.intent.category.BROWSABLE">
        <data android:scheme="bk" android:host="calc">
    </data></category></category></action></intent-filter>
</activity>


2. 소스상에서 host 및 파라미터 받는 방법

url scheme를 사용하면 url 형태로 데이터가 들어오기 때문에 해당 url에서 어떤 액션인지 어떤 파라미터가 있는지 알아야 구분해서 처리를 할 수 있다.

 

url scheme 를 통해서 액티비티가 실행되면 intent에 data 가 포함되어 들어온다.

Uri data = getIntent().getData(); 를 통해서 data를 받아올 수 있다.

여기서 getIntent().getData(); 값이 null 인지 아닌지 체크를 해야 한다. 그냥 실행된 것인지 url 을 통해서 실행된 것인지 판단해야 하기 때문이다. 그냥 실행된 것이면 null 이된다.


Uri data = getIntent().getData();
if(data != null) {
    //url을 통해서 실행된 것. 파라미터를 받아서 작업 수행해야 함.
}


Uri의 다양한 메소드를 통해서 여러가지 값을 알 수 있다.

toString() 으로 전체 url 형태를 알 수 있다.

getHost() 로 host 값을 알 수 있다.

getQuery()로 전체 파라미터를 알 수 있다.

getQueryParameter(String key) 로 각각의 파라미터의 값을 알 수 있다.

 

만약 bk://calc?op1=25&op2=9&operator=+ 이렇게 url을 실행 시키면

scheme 는 bk가 되고 host는 calc가 되면 전체 query는 op1=25&op2=9&operator=+ 이다.

만약 getQueryParameter("op1") 을 하면 25 라는 값을 얻을 수 있다.


html 테그 제거 정규화 입니다. tag 제거할 String 값을 removeTag 에서 넣어주시며 return 값으로 tag가 제거된 String 값이 반환됩니다. 정규화을 공부하시고 사용하시면 더욱 효과적으로 사용 하실수 있습니다.

public String removeTag(String str){
    Matcher mat;  
    // script 처리
 Pattern script = Pattern.compile("&lt;(no)?script[^&gt;]*&gt;.*?<!--(no)?script-->",Pattern.DOTALL);  
    mat = script.matcher(str);  
    str = mat.replaceAll("");  
    // style 처리
    Pattern style = Pattern.compile("<style[^>]*&gt;.*",Pattern.DOTALL);  
    mat = style.matcher(str);  
    str = mat.replaceAll("");  
    // tag 처리
    Pattern tag = Pattern.compile("&lt;(\"[^\"]*\"|\'[^\']*\'|[^\'\"&gt;])*&gt;");  
    mat = tag.matcher(str);  
    str = mat.replaceAll("");  
    // ntag 처리
    Pattern ntag = Pattern.compile("&lt;\\w+\\s+[^&lt;]*\\s*&gt;");  
    mat = ntag.matcher(str);  
    str = mat.replaceAll("");  
    // entity ref 처리
    Pattern Eentity = Pattern.compile("&amp;[^;]+;");  
    mat = Eentity.matcher(str);  
    str = mat.replaceAll("");
     // whitespace 처리
   Pattern wspace = Pattern.compile("\\s\\s+");  
   mat = wspace.matcher(str);
    str = mat.replaceAll("");          
    return str ;
    }
</style[^>

안드로이드 Dialog 전체 화면으로 보여주는 방법입니다.
다이얼로그를 상속받아 페딩(padding) 값없이 보여주거나
다이얼로그를 전체화면 혹은 배경화면 색을 변경 하고 싶을때 사용 하시면 됩니다.
사용방법은 다이얼로그 상속을 받아 Class 를 하나 생성 해주세요.
상속을 받은 Class 에서 super( Context , 여기에 생성한 drawable 파일 ) 을 입력 해주면
다이얼로그를 전체화면과 배경색을 변경하여 사용할 수 있습니다.

public class TestDialog extends Dialog {

    public TestDialog(Context ct, int titleID, int messageID) {
        super(ct, R.drawable.dialog_style);
        this.setContentView(R.layout.dialog_layout);

    }   
}


아래 소스는 복사해서 dialog_layout 파일로 생성 하셔서 drawable 폴더에 생성해주시면 됩니다.

<!--?xml version="1.0" encoding="utf-8"?-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent">
            <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp">
        </padding></solid></shape>
    </item>
    <!-- This shape will be inset by the padding set above -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#262626">
        </solid></shape>
    </item>
</layer-list>



자바 예제

MouseMotionListener 이용해보자


1. 마우스에 별모양 따라 다니는 예제


import java.awt.*;

import java.awt.event.*;


class GraphicsEx2 extends Frame implements MouseMotionListener {
 int x = 0;
 int y = 0;
 
 public static void main(String[] args)  {
  new GraphicsEx2("Graphics2");
 }

 public GraphicsEx2(String title){
   super(title);
   addMouseMotionListener(this);
   addWindowListener(new WindowAdapter(){
     public void windowClosing(WindowEvent we){
      System.exit(0);
     }
   });

 // Frame 을 (100, 100) 의 위치에 width 500, heigth 500 크기로 보이게한다.
 setBounds(100, 100, 500, 500);
 setVisible(true);

 }

 public void paint(Graphics g ){
   g.drawString("마우스를 웁직여보세요." ,10, 50);
   g.drawString("*" , x,y);
 }

 public void update(Graphics g){
  paint(g);
 }

 public void mouseMoved(MouseEvent me){
   x = me.getX();
   y = me.getY();
   repaint();
 }

 public void mouseDragged(MouseEvent me){}
}


2. 버튼을 누르면 별로 그림을 그릴수있는 예제

import java.awt.*;
import java.awt.event.*;


class  GraphicsEx4 extends Frame implements MouseMotionListener {
 int x =0;
 int y = 0;
 Image img = null;
 Graphics gImg = null;

 public static void main(String args[]){
   new GraphicsEx4("Graphics");
 }

 public GraphicsEx4(String title){
  super(title);
  addMouseMotionListener(this);
  addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent we){
     System.exit(0);
    }
  });
 
 //frame (100, 100, 500, 500);
 setBounds(100,100, 500,500);
 setVisible(true);

 img = createImage(500, 500);
 gImg = img.getGraphics();
 gImg.drawString("왼쪽버튼을 누른 채로 마우스를 움직여보세요" , 10, 50);
 repaint();
 }

 public void paint(Graphics g){
  if(img!=null)
   g.drawImage(img , 0 , 0, this); //가상화면에 그려진 그림을 Frame에 복사
 }
 
 public void mouseMoved(MouseEvent me){}

 public void mouseDragged(MouseEvent me){
   if(me.getModifiersEx()==MouseEvent.BUTTON1_DOWN_MASK){
    x = me.getX();
    y = me.getY();
    gImg.drawString("*" ,x,y);
    repaint();
 }
 }
}


3. 마우스를 누르면 선으로 그림을 그릴수 있는 예제

import java.awt.*;
import java.awt.event.*;


class GraphicsEx5 extends Frame implements MouseMotionListener {
  int x =0;
  int y =0;
 
  Image img = null;
  Graphics gImg = null;

  public static void main(String args[]){
   new GraphicsEx5("Graphics");
  }

  public GraphicsEx5(String title){
   super(title);
   addMouseMotionListener(this);
   addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent we){
     System.exit(0);
    }
   });
 
  setBounds(100,100,500,500);
  setVisible(true);

  img = createImage(500,500);
  gImg = img.getGraphics();/  gImg.drawString("왼쪽버튼을 누른채로 마우스를 움직여 보세요 ." , 10 ,50);
  repaint();
  }
 
  public void paint(Graphics g){
   if(img== null) return ;
   g.drawImage(img, 0, 0, this);
  }

  public void mouseMoved(MouseEvent me){
   x = me.getX();
   y = me.getY();
  }

  public void mouseDragged(MouseEvent me){
   if(me.getModifiersEx() != MouseEvent.BUTTON1_DOWN_M-*ASK)  return ;

   gImg.drawLine(x,y, me.getX(), me.getY());
   x = me.getX();
   y = me.getY();

   repaint();
  }
}


안드로이드 개발을 하다 보면 리스트뷰 안에 listview 를 해더로 넣을 경우가 생기는데요
이럴때 스크롤 터치를 잡아줘야 리스트뷰 2개 모두 스크롤이 됩니다. 방법은 requestDisallowInterceptTouchEvent 요것을 true 로 해주면 터치를 잡을 수 있습니다.

아래는 예제 소스 입니다. 참 쉽습니다.

public class NEW_PeopleMain extends Fragment{

    private ListView PeopleList , PeopleHeaderList;
    private View Header;
        
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.new_peoplemain, null);
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        init();
            
    }
    
    public void init(){
          String str[] = { "line1","line2","line3","line4","line5",
                          "line6","line7","line8","line9","line10"};

         ArrayAdapter<string> adapter = new ArrayAdapter<string>(getActivity() , android.R.layout.simple_list_item_1 , str);

        Header = LayoutInflater.from(getActivity()).inflate(R.layout.new_peopleheader, null);
        PeopleList = (ListView)getActivity().findViewById(R.id.people_list);
        PeopleHeaderList = (ListView)Header.findViewById(R.id.people_hlist2);

        PeopleList.addHeaderView(Header);
        
        PeopleList.setAdapter(adapter);
        PeopleHeaderList.setAdapter(adapter);
        
        PeopleHeaderList.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                PeopleHeaderList.requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });

        
    }
    
}
</string></string>




1. 글자 크기


   TextView  tv = (TextView) findViewById(R.id.textView01); 
  String  str = "하나의 텍스트뷰에서 스타일 다르게 적용하기"; 
  
  final SpannableStringBuilder sps = new SpannableStringBuilder(str); 
  sps.setSpan(new AbsoluteSizeSpan(30), 4, 10,  Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
  tv.append(sps); 


2. 원하는 글자만 색  변경


TextView tv = (TextView) findViewById(R.id.textView01); 
   String str = "하나의 텍스트뷰에서 스타일  다르게 적용하기"; 
   
  final SpannableStringBuilder  sps = new SpannableStringBuilder(str); 
  sps.setSpan(new ForegroundColorSpan(-6697729), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
  tv.append(sps); 


3. 첫글자 대문자로 변경


public String on(){
  첫글자 대문자로
  StringBuilder sb = new StringBuilder("한국");
  sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
  Log.e(" === ", " === " + sb.toString());
  return sb.toString();
 }

+ Recent posts