레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시

2012년 11월 27일 화요일

안드로이드와 수행시간((Elapsed time) 측정

작성자: 박영기
작성일: 2012-11-28


일반적으로 리눅스에서 수행시간 측정을 위해 사용하는 함수는 gettimeofday()입니다.

안드로이드에서는 수행시간 측정을 위해 SystemClock.elapsedRealtime()를 사용합니다.
System.currentTimeMillis()함수는 측정용으로 사용하면 안되는데, 그 이유는 일반적으로 보여주기위한 용도이기 때문에 정확도가 떨어지기 때문입니다.

----------------------------------------------

한동안 시간 처리가 제대로 된다고 생각했습니다.
그런데 SystemClock.elapsedRealtime()역시 시간측정이 제대로 되지 않는군요.
일단 현재까지는 JNI로 gettimeofday()를 호출하는 함수를 따로 만들어야 되지 않을까 하는 생각이 들구요.
좋은 방법을 찾으면 이 글을 갱신하도록 하겠습니다.

참조


2012년 11월 26일 월요일

안드로이드와 이클립스(eclipse) 그리고 AndroidManifest.xml

작성자: 박영기
작성일: 2012-11-27



안드로이드 샘플코드 중 BluetoothChat을 eclipse로 열었을 때 일어난 일이다. 소스코드에 온통 빨간줄이 생기면서 에러표기되는데 Eclipse > Menu > Project > Clean 을 실행하면 잠시동안은 에러표기되는 문제가 사라진다. 하지만 근본적인 해결책은 되지 않았다.

그래서 근본적인 문제를 확인해 보았는데, AndroidManifest.xml파일 때문이었다. xml 파서가 스마트하지 않아서 충돌이 일어난 것인데 이것을 해결하려면 uses-sdk 태그의 속성인 minSdkVersion 앞에 'android:'를 써줘야한다.

올바르게 수정한 코드는 아래와 같은 모습이다.


이상.
업무참조 바란다.

2012년 11월 22일 목요일

블루투스와 라이브러리

안드로이드 장비간 블루투스 통신에서 약간의 문제를 확인했다.
페어링을 할 때 팝업으로 버튼을 눌러줘야하는데
입력장치가 없는 장비는 팝업을 눌러줄 수 없다.

한쪽은 임베디드 리눅스를 쓰는 수 밖에 없을 것 같다.

리눅스에서 블루투스를 사용할 수 있는 라이브러리가 있다.
이름은 BlueZ 인데, ODROID-X의 장치명도 BlueZ인걸 보면 같은 것을 사용했나보다.

아래 링크를 참조하면 더 많은 정보를 얻을 수 있을 것 같다. :)


2012년 11월 20일 화요일

Hello Android - Bluetooth 3

작성자: 박영기
작성일: 2012-11-21

이 문서는 Android 개발자 가이드: Bluetooth를 참조하여 작성하였습니다.


discoverability 활성화 시키기 (Enabling discoverability)



용어가 다소 혼동스러울 수 있어서 쉽게 풀어서 설명하겠다. 예를들어, 안드로이드폰과 블루투스 키보드가 있다고 치자. 안드로이드폰은 블루투스 키보드를 발견(discover)할 수 있다.그리고 블루투스 키보드는 안드로이드폰에게 자신을 노출시킬 수 있는 능력(discoverability)를 갖고있다. 이 능력(discoverability)은 On/Off 가능하다. On 상태일 때를 다른말로  discoverable 모드가 활성화 되어있는 상태라고도 한다. 우리말로 설명하면 약간 애매하므로 지금부터 discover와 discoverability, discoverable을 영어 그대로 사용하겠다.

discoverability를 활성화 시키기 위해서는 startActivityForResult(Intent, int) 함수에 ACTION_REQUEST_DISCOVERABLE 액션 인텐트를 사용한다. 이 메소드는 discoverable 모드를 활성화 하도록 시스템에 요청을 보낸다. 기본적으로 디바이스는 120초 동안 discoverable 될 수 있다. 이 시간은 EXTRA_DISCOVERABLE_DURATION 인텐트 엑스트라를 추가하는 것으로 변경할 수 있다. 이 값의 단위는 초이다. 범위는 1부터 3600까지고, 0이 의미하는 것은 항상 discoverable 상태에 있도록 한다는 의미이다. 0보다 작고 3600보다 큰 값은 자동으로 120초로 설정된다. 300초로 설정하는 예제는 다음과 같다:

Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);


//
// ODROID-X에서 discoverable 모드가 동작하지 않는다. OTL
// 따라서 이 글은 문제가 해결되면 계속 작성할 것이다.



2012년 11월 19일 월요일

Hello Android - Bluetooth 2

작성자: 박영기
작성일: 2012-11-20
이 문서는 Android 개발자 가이드: Bluetooth를 참조하여 작성하였습니다.


연결된 디바이스 목록 보기


새 Bluetooth 디바이스를 검색하기 전에
이미 연결되어있는지 확인하는 것이 좋다.

위 코드의 동작을 확인하려면
Android Setting 메뉴에서
새 블루투스 디바이스를 연결해야한다.

필자는 블루투스 키보드를 사용하였는데 결과값으로 "i-rocks Bluetooth Keyboard"와 "DC:2C:26:00:4A:29"가 출력되었다. 각각 디바이스 이름과 MAC Address이다.


새 Bluetooth 디바이스 발견하기



// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy

이 코드의 실행 결과는 흡사 UDP Multicast Group에 참여해서 자신의 존재를 알리기 위해 메시지를 일정시간동안 보내는 것과 유사하다.

BroadcastReceiver class의 객체의 추상메소드인 onReceive()를 구현한 후
android.content.Context class의 registerReceiver() 메소드에 인자로 전달하면
콜백을 받을 준비가 끝난다.

이후 BluetoothAdapter.startDiscover() 함수를 호출하면
약 12초 동안 onRecive() 콜백이 여러번 호출된다.

이건 흡사 Android 기기 > Setting 메뉴 > Bluetooth 에 나오는
Bluetooth 디바이스 목록 페이지와 유사하다.
단, Setting 메뉴에서는 시간 제한이 없다는 차이점이 있다.

주의: 새 Bluetooth 디바이스를 발견하는 일은 꽤 무거운 작업이고, 리소스를 많이 소비한다. 따라서 연결할 디바이스를 찾았다면 확실히 하기 위해서 cancelDiscovery() 를 호출해서 discovery 작업을 중지시켜야한다. 또한 이미 디바이스가 연결된 상태에서 discovery 작업을 할 경우 사용 가능한 대역폭이 아주 많이 감소하게 되므로 주의해야한다.

Hello Android - Bluetooth 1

작성자: 박영기
작성일: 2012-11-20

이 문서는 Android 개발자 가이드: Bluetooth를 참조하여 작성하였습니다.


Bluetooth 권한

블루투스를 사용하는 앱은 다음 두 권한이 필요하다.


manifast 파일을 열어 다음과 같이 권한을 추가한다.




    
    
    

    
        
            
                
                
            
        
    




이들 권한에 대한 자세한 사항은 이 링크를 참고한다.


BluetoothAdapter 객체 얻기


BluetoothAdapter는 전 안드로이드 기기를 통틀어 하나밖에 없다.
다시 말하면, 싱글톤 객체다.
따라서 new를 사용하지 않고 static 메소드로 객체를 얻는다.



BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
    // Device does not support Bluetooth
}

Bluetooth 활성화 시키기


Bluetooth가 존재하지만 비활성화 상태일 때에는 이렇게 활성화시킨다.

단, REQUEST_ENABLE_BT는 지역변수이고 0보다 큰 값을 가진다.

if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}


이 코드를 실행시키면 다음 그림을 볼 수 있다.





앞에서 호출한 startActivityForResult()는 비동기 함수이며 즉시 리턴한다.
수행결과는 잠시후 onActivityResult() 콜백으로 전달된다.

void android.app.Activity.startActivityForResult(Intent intent, int requestCode)
void android.app.Activity.onActivityResult(int requestCode, int resultCode, Intent data)

startActivityForResult()에서 두 번째 인자와 onActivityResult()의 첫 번째 인자가 같다는 것을 눈여겨 보길 바란다.

안드로이드와 버튼(android.widget.Button)

작성자: 박영기
작성일: 2012-11-19

업무상 Android를 해야 할 일이 생겼다.
새로운 플랫폼에서 제일 먼저 해야 할 일은
Hello World를 찍는 일.

익명 메소드를 사용한 예제:

package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button bbb = (Button) findViewById(R.id.button1);
        bbb.setOnClickListener(new Button.OnClickListener() { 
         public void onClick(View v)
         {
          Button btn = (Button) findViewById(R.id.button1);
          btn.setText("Hello Android");
         }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
}



이번엔 일반적인 예제:

package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private void initialize() {
        // TODO Auto-generated method stub
        Button btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(this);
    }

    public void onClick(View v)
    {
        switch(v.getId())
        {
            case R.id.button1:
                onButton1_click();
                break;
            }
    }

    private void onButton1_click() {
        // TODO Auto-generated method stub
        Button btn = (Button) findViewById(R.id.button1);
        btn.setText("Hello");
    }
}

2012년 11월 15일 목요일

Android SDK 설치방법 변경

작성자: 박영기
작성일: 2012-11-16


몇 달 전에는 eclipse와 adt-plugin 그리고 SDK를 따로 받아서 설치했어야 했다.
오늘 다시 Android 사이트를 방문해 보니
그 모든 것들이 하나로 통합되어있다.

그냥 압축만 풀고 eclipse를 실행시키면 된다.
That's it!

참조


Android 개발하기 - 목차



Android 블루투스(bluetooth) 개발하기

작성자: 2012-11-16
작성일: 박영기

이 글은 작성중입니다.

참조