2011年12月31日土曜日

PictureSize and format

Change picture format and size at Camera Class
get current picture format .
Camera.Parameters param = camera.getParameters();
Log.d("camera", "format= " + param.getPictureFormat ());
get supported picture format list.
Camera.Parameters param = camera.getParameters();
List pictureformatlist = param.getSupportedPictureFormats ();
for (int i=0;i < pictureformatlist.size();i++) {
 Log.d("camera", "format " + i + " = " + pictureformatlist.get(i));
}
NexusOne is suppoerted 256(JPEG) only.
get current picture size.
//get
Camera.Parameters param = camera.getParameters();
//get picture size
Log.d("camera", "width= " + param.getPictureSize ().width + " height= " + param.getPictureSize ().height);
get supported picture size list.
Camera.Parameters param = camera.getParameters();
List picturesizelist = param.getSupportedPictureSizes ();
for (int i=0;i < picturesizelist.size();i++) {
 Log.d("camera", i + " width = " + picturesizelist.get(i).width + " height = "  + picturesizelist.get(i).height);
}
NexusOne is supported list:
width = 2592 height = 1944
width = 2048 height = 1536
width = 1600 height = 1200
width = 1024 height = 768
width = 512 height = 384
set picture size. change taken picture image size.
Camera.Parameters param = camera.getParameters();
param.setPictureSize(2048, 1536);
camera.setParameters(param);

source code is here.

GridView From SDCard Video

I tryed GridView. It was made from SD Card Video Clip.

I created class at extends BaseAdatpter.
Override getCount(), getItem(), getItemId(), getView().
getView() is creating ImageView from video clip.
getCount() return is SDCard Video Clip Number
public int getCount() {
 Cursor c = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null,null);
 return c.getCount();
}

getItem() is no use.
public Object getItem(int arg0) {
 return null;
}
getItemId() is no use.
public long getItemId(int position) {
 return 0;
}
This is getView()..

I create Cursor and move position.
Cursor c = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null,null);
c.moveToPosition(position);
check file path.
int dataIndex = c.getColumnIndex(MediaStore.Video.Media.DATA);
String path = c.getString(dataIndex);
get thumbnail bitmap.
Bitmap bmp = ThumbnailUtils.createVideoThumbnail(path,MediaStore.Video.Thumbnails.MINI_KIND );
setView.
imageView.setImageBitmap(bmp);
view set adapter extends BaseAdapter.
mGridView = (GridView)findViewById(R.id.gridView1);
mGridView.setAdapter(new ImageAdapter());
source code is here.

getPreviewSize getPreviewFormat

check Camera class getPreviewFormat() API.
get now setting and supported list.
Camera.Parameters param = camera.getParameters();
//get preview format
Log.d("camera", "PreviewFormat=" + param.getPreviewFormat());
//get preview supported format
List< Integer > previewformatlist = param.getSupportedPreviewFormats ();
for (int i=0;i < previewformatlist.size();i++) {
 Log.d("camera", i + " format = " + previewformatlist.get(i));
}
NexusOne is supported NV21 only.
check Camera class getPreviewSize() API.
get now setting and supported list.
//get
Camera.Parameters param = camera.getParameters();
//get preview size
Log.d("camera", "PreviewSize width=" + param.getPreviewSize().width + " heigth=" + param.getPreviewSize().height);
//get preview supported size
List< Camera.Size > previewsizelist = param.getSupportedPreviewSizes ();
for (int i=0;i < previewsizelist.size();i++) {
 Log.d("camera", i + " size width = " + previewsizelist.get(i).width + " height = " + previewsizelist.get(i).height);
}
They are supported list at NexusOne.
 0 size width = 1280 height = 720
 1 size width = 800 height = 480
 2 size width = 720 height = 480
 3 size width = 640 height = 480
 4 size width = 576 height = 432
 5 size width = 480 height = 320
 6 size width = 384 height = 288
 7 size width = 352 height = 288
 8 size width = 320 height = 240
 9 size width = 240 height = 160
 10 size width = 176 height = 144

Source code is here.

setPreviewFpsRange

Check Camera Class getPreviewFPS() API. NexusOne is supported one pair only.
Check PreviewPFS now.
Camera.Parameters param = camera.getParameters();
int[] fpsrange = new int[2];
param.getPreviewFpsRange(fpsrange);
Log.d("camera", "min= " + fpsrange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX]);
Log.d("camera", "max= " + fpsrange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
Get supported PreviewFPS.
Camera.Parameters param = camera.getParameters();
List fpslist = param.getSupportedPreviewFpsRange();
Log.d("camera", "size= " + fpslist.size());
for (int i=0;i < fpslist.size();i++) {
 Log.d("camera", i + " fps= " + fpslist.get(i)[Camera.Parameters.PREVIEW_FPS_MIN_INDEX]);
 Log.d("camera", i + " fps= " + fpslist.get(i)[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
}
NexusOne supported value is Max = 26620 and Min 9831.
set PreviewFPS.I think Max and Min combination is getSupportedPreviewFpsRange() result only, if other do exception.
Camera.Parameters param = camera.getParameters();
param.setPreviewFpsRange(9831, 26620);
camera.setParameters(param);
Source code is here.

setSceneMode

Check Scene. But My NexusOne is not suppoert SceneMode.
getSceneMode() = null. This article is just information.

Check SceneMode now.
Camera.Parameters param = camera.getParameters();
Log.d("camera", "now = " + param.getSceneMode ());
Check supported SceceMode.

Camera.Parameters param = camera.getParameters();
List< String > modelist = param.getSupportedSceneModes ();

for (int i=0;i < modelist.size();i++) {
 Log.d("camera", "type= " + modelist.get(i));
}
Set ScenceMode.
Camera.Parameters param = camera.getParameters();
param.setSceneMode(modelist.get(mode_counter));
camera.setParameters(param);
Source code is here.

ActivityInstrumentationTestCase2 sendPointerSync

I try sendPointerSync() API over surfaceView.
First, Target Activity Code:
layout file is main.xml ....


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


ActivityInstrumentationTestCase2 invokeMenuActionSync

I try menu test. I used invokeMenuActionSync().
target Activity code.
This is menu create code.
menu.add(Menu.NONE, Menu.FIRST, Menu.NONE, "1");
menu.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "2");
This is menu pushed code.
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case Menu.FIRST:
     Log.d("test", "pushed 1");
        break;
    case Menu.FIRST + 1:
     Log.d("test", "pushed 2");
        break;
    default:
        break;
    }
    return true;
}   

This is Tester.
This is push menu and push menu button.
mInstrumentation.invokeMenuActionSync(mActivity, Menu.FIRST, 0);

Do test like here.
Logcat view follow:
pushed 1

Target Activity source code is here.
Tester source code is here.

2011年12月30日金曜日

ActivityInstrumentationTestCase2

 I try JUnit.


Target Activity.

There is only button. I check logcat whether button is pushed.
Button button = (Button)findViewById(R.id.button1);

button.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  Log.d("test", "button1");
 }
});
This is Tester. Only Button pushed.

setUp:get Activity and instrumentation.
mActivity = getActivity();
mInstrumentation = getInstrumentation();
test is button pushed. This must be no Errors.
public void testPushButton() throws Exception {
 
 final Button btnExecute = (Button)mActivity.findViewById(R.id.button1);
 
 mActivity.runOnUiThread(new Runnable() {
  public void run() {
   btnExecute.dispatchTouchEvent(MotionEvent.obtain(5,0, MotionEvent.ACTION_DOWN, 0, 0, 0));
   btnExecute.dispatchTouchEvent(MotionEvent.obtain(5,0, MotionEvent.ACTION_UP, 0, 0, 0));
   
  }
  
 });
 
 mInstrumentation.waitForIdleSync();
 
 assertEquals(true , true);
}

Test Start to select Tester 's "Android JUnit Test" like follow


It is result:



target source code is here.
Tester source code is here.

Logcat time

I thought logcat time was windows pc time.
but I found logcat time is cell phone time.



2011年12月19日月曜日

setWhiteBalance

I check setWhiteBalance() in Android.
I get WhiteBanance Parameter now.

Camera.Parameters param = camera.getParameters();
Log.d("camera", "now= " + param.getWhiteBalance ());

I print support paramter list in this machine.
Camera.Parameters param = camera.getParameters();
List< String > whitelist = param.getSupportedWhiteBalance ();
for (int i=0;i < whitelist.size();i++) {
 Log.d("camera", "type= " + whitelist.get(i));
}
This is NexusOne Paramter List.
auto
incandescent
fluorescent
daylight
cloudy-daylight


I set WhiteBalance.
param.setWhiteBalance(whitelist.get(white_mode));
camera.setParameters(param);

source code is here.

2011年12月15日木曜日

Application class

I try Application class on Android.




This is Application class. It is Saving int value.
public class TestApplication extends Application {
public class TestApp extends Application {
 private int _number = 0;
 @Override
    public void onCreate() {
  Log.d("test", "onCreate");
 }
    @Override
    public void onTerminate() {
  Log.d("test", "onTerminate");
    }
    public void setNumber(int number){
  Log.d("test", "setNumber");
     _number = number;
    }
    public int getNumber(){
  Log.d("test", "getNumber");
     return _number;
    }

}

This is Setter Activity for application class.

_testApp = (TestApp) this.getApplication();

_testApp.setNumber(8);
Log.d("test", "Number = "+ _testApp.getNumber());

And wake up getter Activity.
Intent intent = new Intent();
intent.setClass(this, TesterActivity.class);
startActivity(intent);

This is getter Activity.
_testApp = (TestApp) this.getApplication();

Log.d("test", "Tester Number = "+ _testApp.getNumber());

This application Log:
onCreate
setNumber
getNumber
Number = 8
getNumber
Tester Number = 8
I must change Android Manifest.xml
source code is here.


I reference ...


I reference android site. They are Techfirm Lab and tech Booster

Thanks very much!

tech Booster
http://techbooster.org/


Techfirm Lab
http://labs.techfirm.co.jp/android/

2011年12月13日火曜日

Try Semaphore

I check Semaphore.

It's allow sample

Semaphore sem = new Semaphore(1); //allow  only 1 member .
Log.d("test", "constructure");
sem.drainPermits(); // No permit.
Log.d("test", "drainPermits");

sem.release(); //release semaphore and 1 permit.

Log.d("test", "release");

try {
 sem.acquire(); //require permit.
} catch (InterruptedException e) {
 e.printStackTrace();
}

Log.d("test", "acquire"); //allowed
Up program log:
constructure
drainPermits
release
acquire
up program source code

2011年12月10日土曜日

addCallbackbuffer was used

I check addCallbackBuffer().
addCallbackBuffer() registers the buffer to use OnPreviewFrame(). OnPreviewFrame() was registered setPreviewCallbackWithBuffer().

First, caculate the buffer size. frame_size is the buffer size.
example. width = 800 and height = 400, PreviewFormat is NV21 , frame_size is 576000 byte.

Camera.Parameters param = _camera.getParameters();
int imgformat = param.getPreviewFormat();
int bitsperpixel = ImageFormat.getBitsPerPixel(imgformat);
int byteperpixel = bitsperpixel / 8;
Camera.Size camerasize = param.getPreviewSize();
int frame_size = ((camerasize.width * camerasize.height) * bitsperpixel) / 8;

prepare callback function. If you process video image, you use data to received by callback.

private Camera.PreviewCallback mPreviewListener = new Camera.PreviewCallback() {
 @Override
 public void onPreviewFrame(byte[] data, Camera camera) {
  Log.d("camera", "onPreviewFrame size=" + data.length);
     //outputFile(data);//ファイル取得する関数
       //_camera.addCallbackBuffer(data);//バッファを再利用する
 }
};

register callback.

_camera.setPreviewCallbackWithBuffer(mPreviewListener);


register the buffer. If register the buffer, callback function is called soon.

byte[] frame = new byte[frame_size];
_camera.addCallbackBuffer(frame);

My source code is here.

MediaPlayer seekto

I try MediaPlayer class seekTo() and preparedAsync() API.



First, I designed if touch, move 10000 msec position from clip top.
boolean isSeeking = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
 switch(event.getAction()) {
 case MotionEvent.ACTION_DOWN:
  if (isSeeking == false) {
   isSeeking = true;
   _mediaplayer.seekTo(10000);
  } else {
   //Do nothing
  }
  break;
 default:
  break;
 }
 return  super.onTouchEvent(event);
 
}
And... I had to catch seek complete event.
@Override
public void onSeekComplete(MediaPlayer mp) {
 isSeeking = false;
}
Must register seek complete listener
_mediaplayer.setOnSeekCompleteListener(this);
Second, I tryed preparedAsync(). call preparedAsync() and register prepared complete event
_mediaplayer.setOnPreparedListener(this);
_mediaplayer.setOnSeekCompleteListener(this);
_mediaplayer.prepareAsync();
This is prepared completed process:
@Override
public void onPrepared(MediaPlayer mp) {
 _mediaplayer.start();
 Log.d("player", "start");
}

My source code is here.

MediaPlayer API more and more

I used MediaPlayer class API.
getAudioSessionId(), getCurrentPosition(), and pause().
and I try any Listener interface implement.
onCompletion(), onError(), onInfo(), onVideoSizeChanged(),


  • when app  play clip, onVideoSizeChanged() is called soon.
  • when app run clip end, onCompletion() is called.
  • If setLoop(true), onCompletion() isn't call. but onInfo() is called by what = 1 and extra = 44.



I used getAudioSessionId(), getCurrentPosition().
Log.d("player", "getAudioSessionId = " + _mediaplayer.getAudioSessionId());
Log.d("player", "getCurrentPosition = " + _mediaplayer.getCurrentPosition());

I designed as if app play clip, app call pause and if app pause, app play clip.
boolean isPause = false;
・・・・
if (isPause == false) {
 isPause = true;
 _mediaplayer.pause();
} else {
 isPause = false;
 _mediaplayer.start();
}
Implements Listeners:
@Override
public void onCompletion(MediaPlayer mp) {
 Log.d("player", "onCompletion");
 
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
 Log.d("player", "onError what = " + what + "extra = " + extra);
 return false;
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
 Log.d("player", "onInfo what = " + what + "extra = " + extra);
 return false;
}
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
 Log.d("player", "onVideoSizeChanged width = " + width + " height = " + height);
 
}
@Override
public void onPrepared(MediaPlayer mp) {
 Log.d("player", "onPrepared");
}


Must Register listener before MediaPlayer.start():
_mediaplayer.setOnCompletionListener(this);
_mediaplayer.setOnErrorListener(this);
_mediaplayer.setOnInfoListener(this);
_mediaplayer.setOnPreparedListener(this);
_mediaplayer.setOnVideoSizeChangedListener(this);
My source code is here.

2011年12月9日金曜日

MediaPlayer API More

I used more MediaPlayer class API.
getDuration(), getVideoHeight(), getVideoWidth(), isLooping(), isPlaying().

While app not play clip, getVideoHeight() = 0 and getVideoWidth() = 0. and isPlaying() is false.
Log.d("player", "duration = " + _mediaplayer.getDuration());
Log.d("player", "getVideoHeight = " + _mediaplayer.getVideoHeight());
Log.d("player", "getVideoWidth = " + _mediaplayer.getVideoWidth());
Log.d("player", "isLooping=" + _mediaplayer.isLooping());
Log.d("player", "isPlaying=" + _mediaplayer.isPlaying());

but.. While app play clip, getVideoHeigth() = 240, getVideoWidth=320, and isPlaying=true.
Log.d("player", "getVideoHeight = " + _mediaplayer.getVideoHeight());
Log.d("player", "getVideoWidth = " + _mediaplayer.getVideoWidth());
Log.d("player", "isPlaying=" + _mediaplayer.isPlaying());
My source code is here.

GridView

I used GridView class.



Reference to google develper site

This is screen shot
My Source code here

2011年12月4日日曜日

clip player

I used MediaPlayer class.

make ready layout for playback image follow:


    



make ready surface callback follow:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
  int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
 // TODO Auto-generated method stub
}

First I create surface view.
 _preview = (SurfaceView)findViewById(R.id.surfaceView1);
 _holder = _preview.getHolder();
 _holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 _holder.addCallback(this);

Second If surfaceCreated call, start to play clip.
String path = "/sdcard/sample.mp4";
_mediaplayer = new MediaPlayer();
try {
 _mediaplayer.setDataSource(path);
} catch (IllegalArgumentException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
} catch (IllegalStateException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}
_mediaplayer.setDisplay(holder);
try {
 _mediaplayer.prepare();
} catch (IllegalStateException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}
_mediaplayer.setOnPreparedListener(this);

Last If end prepare(), onPrepared called.
@Override
public void onPrepared(MediaPlayer mp) {
 // TODO Auto-generated method stub
 _mediaplayer.start();
}


source code here

cancelAutoFoucs

I check cancelAutoFocus API.


call autoFoucs().
_camera.autoFocus(null);

call cancelAutoFocus(). focus moves default position when call cancelAutoFocus().
_camera.cancelAutoFocus();
souce code here.

CameraInfo

I research CameraInfo API.



Get number of camera.
int numberofcamera = Camera.getNumberOfCameras();
Log.d("camera", "number = " + numberofcamera);

get CameraInfo and print the information.
for (int i = 0 ; i < numberofcamera;i++) {
 CameraInfo camerainfo = new Camera.CameraInfo();
 Camera.getCameraInfo(i, camerainfo);
 
 Log.d("camera", "facing =" + camerainfo.facing);
 Log.d("camera", "orientation =" + camerainfo.orientation);
}
My Phone NexusOne has ... Cmaera is one. facing is 0, orientation is 90.
"facing = 0" means camera is agenst screen.
I need to research orientation.

source code here