Revision: 813
http://swingme.svn.sourceforge.net/swingme/?rev=813&view=rev
Author: janeroski
Date: 2010-04-21 17:41:30 +0000 (Wed, 21 Apr 2010)
Log Message:
-----------
Multimedia API: Show view finder
Modified Paths:
--------------
AndroidME/AndroidManifest.xml
AndroidME/src_Android/net/yura/android/AndroidMeMIDlet.java
AndroidME/src_Android/net/yura/android/lcdui/Toolkit.java
AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/BasicPlayer.java
AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/CameraPlayer.java
AndroidME/src_MIDP/javax/microedition/lcdui/Canvas.java
AndroidME/src_MIDP/javax/microedition/media/Player.java
AndroidME/src_MIDP/javax/microedition/media/PlayerListener.java
Modified: AndroidME/AndroidManifest.xml
===================================================================
--- AndroidME/AndroidManifest.xml 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/AndroidManifest.xml 2010-04-21 17:41:30 UTC (rev 813)
@@ -17,9 +17,12 @@
</application>
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="4" />
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
- <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
- <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
- <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
+ <uses-feature android:name="android.hardware.camera" />
+
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+ <uses-permission android:name="android.permission.CAMERA" />
</manifest>
\ No newline at end of file
Modified: AndroidME/src_Android/net/yura/android/AndroidMeMIDlet.java
===================================================================
--- AndroidME/src_Android/net/yura/android/AndroidMeMIDlet.java 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/src_Android/net/yura/android/AndroidMeMIDlet.java 2010-04-21 17:41:30 UTC (rev 813)
@@ -34,7 +34,6 @@
private Handler handler;
private Thread eventThread;
private Object lock = new Object();
- private Vector<View> overlayViews = new Vector<View>();
public static AndroidMeMIDlet DEFAULT_ACTIVITY;
@@ -97,26 +96,6 @@
// System.setOut(log);
}
-
- @Override
- public void setContentView(View view) {
- super.setContentView(view);
-
- for (int i = 0; i < overlayViews.size(); i++) {
- super.addContentView(overlayViews.elementAt(i), null);
- }
- }
-
- public void addOverlayView(View v) {
- if (!overlayViews.contains(v)) {
- overlayViews.add(v);
- }
- }
-
- public void removeOverlayView(View v) {
- overlayViews.remove(v);
- }
-
private void showContentView(final View view) {
invokeAndWait(new Runnable() {
public void run() {
Modified: AndroidME/src_Android/net/yura/android/lcdui/Toolkit.java
===================================================================
--- AndroidME/src_Android/net/yura/android/lcdui/Toolkit.java 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/src_Android/net/yura/android/lcdui/Toolkit.java 2010-04-21 17:41:30 UTC (rev 813)
@@ -10,10 +10,6 @@
View inflate(int resourceId);
- void addOverlayView(View v);
-
- void removeOverlayView(View v);
-
int getScreenWidth();
int getScreenHeight();
Modified: AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/BasicPlayer.java
===================================================================
--- AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/BasicPlayer.java 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/BasicPlayer.java 2010-04-21 17:41:30 UTC (rev 813)
@@ -22,10 +22,11 @@
// Player worker methods
abstract protected void doRealize() throws MediaException;
abstract protected void doPrefetch() throws MediaException;
- abstract protected boolean doStart() throws MediaException;
+ abstract protected void doStart() throws MediaException;
abstract protected void doStop();
abstract protected void doDeallocate();
abstract protected void doClose();
+
abstract protected long doSetMediaTime(long now) throws MediaException;
abstract protected long doGetMediaTime();
abstract protected long doGetDuration();
@@ -68,7 +69,7 @@
chkClosed(false);
if (state < REALIZED) {
- doRealize();
+ sendPlayerEvent("doRealize", null);
state = REALIZED;
}
}
@@ -80,7 +81,7 @@
if (state < PREFETCHED) {
realize();
- doPrefetch();
+ sendPlayerEvent("doPrefetch", null);
state = PREFETCHED;
}
@@ -99,10 +100,10 @@
// JP if (EOM)
// setMediaTime(0);
- doStart();
+ sendPlayerEvent("doStart", null);
state = STARTED;
- sendEvent(PlayerListener.STARTED, new Long(getMediaTime()));
+ sendListenerEvent(PlayerListener.STARTED, new Long(getMediaTime()));
}
}
@@ -112,10 +113,14 @@
//JP loopAfterEOM = false;
if (state >= STARTED) {
- doStop();
+ try {
+ sendPlayerEvent("doStop", null);
+ }
+ catch (Exception e) {
+ }
state = PREFETCHED;
- sendEvent(PlayerListener.STOPPED, new Long(getMediaTime()));
+ sendListenerEvent(PlayerListener.STOPPED, new Long(getMediaTime()));
}
}
@@ -126,7 +131,11 @@
if (state >= PREFETCHED) {
stop();
- doDeallocate();
+ try {
+ sendPlayerEvent("doDeallocate", null);
+ }
+ catch (MediaException e) {
+ }
state = REALIZED;
}
}
@@ -134,7 +143,11 @@
public synchronized void close() {
if (state > CLOSED) {
deallocate();
- doClose();
+ try {
+ sendPlayerEvent("doClose", null);
+ }
+ catch (MediaException e) {
+ }
state = CLOSED;
@@ -143,7 +156,7 @@
// stream.close();
// } catch (IOException e) { }
- sendEvent(PlayerListener.CLOSED, null);
+ sendListenerEvent(PlayerListener.CLOSED, null);
}
}
@@ -194,7 +207,7 @@
listenerList.remove(playerListener);
}
- public void sendEvent(final String evt, final Object evtData) {
+ void sendListenerEvent(final String evt, final Object evtData) {
// There's always one listener for EOM -- itself.
if (listenerList.size() > 0 || evt == PlayerListener.END_OF_MEDIA) {
@@ -238,7 +251,51 @@
}
}
+ void doPlayerEvent(final String evt, final Object evtData) throws MediaException {
+ if (evt == "doRealize") {
+ doRealize();
+ }
+ else if (evt == "doPrefetch") {
+ doPrefetch();
+ }
+ else if (evt == "doStart") {
+ doStart();
+ }
+ else if (evt == "doStop") {
+ doStop();
+ }
+ else if (evt == "doDeallocate") {
+ doDeallocate();
+ }
+ else if (evt == "doClose") {
+ doClose();
+ }
+ }
+ Throwable playerException;
+ void sendPlayerEvent(final String evt, final Object evtData) throws MediaException {
+ playerException = null;
+
+ toolKit.invokeAndWait(new Runnable() {
+ public void run() {
+ try {
+ doPlayerEvent(evt, evtData);
+ } catch (Throwable e) {
+ playerException = e;
+ }
+ }
+ });
+
+ if (playerException != null) {
+ if (playerException instanceof MediaException) {
+ throw (MediaException) playerException;
+ } else {
+ playerException.printStackTrace();
+ }
+ }
+ }
+
+
//JP /**
// * the worker method to deliver EOM event
// */
Modified: AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/CameraPlayer.java
===================================================================
--- AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/CameraPlayer.java 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/src_JSR135_Multimedia/javax/microedition/media/player/CameraPlayer.java 2010-04-21 17:41:30 UTC (rev 813)
@@ -1,14 +1,33 @@
package javax.microedition.media.player;
+import java.io.IOException;
+
import javax.microedition.media.Control;
import javax.microedition.media.Controllable;
import javax.microedition.media.MediaException;
import javax.microedition.media.control.VideoControl;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.hardware.Camera;
+import android.hardware.Camera.PreviewCallback;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.ViewGroup.LayoutParams;
+
+import net.yura.android.AndroidMeMIDlet;
import net.yura.android.lcdui.Toolkit;
public class CameraPlayer extends BasicPlayer implements VideoControl, Controllable {
+ private Preview preview;
+ private Camera camera;
+ private javax.microedition.lcdui.Canvas canvas;
+ private int displayX, displayY;
+ private int displayW, displayH;
+ private boolean fullScreen;
public CameraPlayer(Toolkit toolKit) {
super(toolKit);
@@ -16,20 +35,28 @@
@Override
protected void doClose() {
- // TODO Auto-generated method stub
+ if (preview != null) {
+ setVisible(false);
+ preview = null;
+ }
+ if (camera != null) {
+ camera.setPreviewCallback(null);
+ camera.stopPreview();
+ camera.release();
+ camera = null;
+ }
}
@Override
protected void doDeallocate() {
- // TODO Auto-generated method stub
-
+ // Do nothing...
}
@Override
protected Control doGetControl(String type) {
- if ("VideoControl".equalsIgnoreCase(type) ||
- "GUIControl".equalsIgnoreCase(type)) {
+ if ("javax.microedition.media.control.VideoControl".equalsIgnoreCase(type) ||
+ "javax.microedition.media.control.GUIControl".equalsIgnoreCase(type)) {
return this;
}
@@ -55,14 +82,12 @@
@Override
protected void doPrefetch() throws MediaException {
- // TODO Auto-generated method stub
-
+ // Do nothing...
}
@Override
protected void doRealize() throws MediaException {
- // TODO Auto-generated method stub
-
+ // Do nothing...
}
@Override
@@ -72,70 +97,117 @@
}
@Override
- protected boolean doStart() throws MediaException {
- // TODO Auto-generated method stub
- return false;
+ protected void doStart() throws MediaException {
+ if (preview != null && camera != null) {
+ camera.startPreview();
+ }
}
@Override
protected void doStop() {
- // TODO Auto-generated method stub
+ if (preview != null && camera != null) {
+ camera.stopPreview();
+ }
}
public int getDisplayHeight() {
- // TODO Auto-generated method stub
- return 0;
+ checkDisplayState();
+
+ return preview.getHeight();
}
public int getDisplayWidth() {
- // TODO Auto-generated method stub
- return 0;
+ checkDisplayState();
+
+ return preview.getWidth();
}
public int getDisplayX() {
- // TODO Auto-generated method stub
- return 0;
+ return displayX;
}
public int getDisplayY() {
- // TODO Auto-generated method stub
- return 0;
+ return displayY;
}
public byte[] getSnapshot(String s) throws MediaException {
+ checkDisplayState();
+
+
// TODO Auto-generated method stub
return null;
}
public int getSourceHeight() {
- // TODO Auto-generated method stub
- return 0;
+ // If we can't record video, this method is meaningless...
+ // Return screen height for now.
+ return toolKit.getScreenHeight();
}
public int getSourceWidth() {
- // TODO Auto-generated method stub
- return 0;
+ // If we can't record video, this method is meaningless...
+ // Return screen width for now.
+ return toolKit.getScreenWidth();
}
- public Object initDisplayMode(int i, Object obj) {
- // TODO Auto-generated method stub
+ public Object initDisplayMode(int mode, Object obj) {
+
+ if (preview != null) {
+ throw new IllegalStateException("initDisplayMode: called before");
+ }
+
+ if (mode != USE_DIRECT_VIDEO || !(obj instanceof javax.microedition.lcdui.Canvas)) {
+ throw new IllegalArgumentException("initDisplayMode: Only USE_DIRECT_VIDEO and Canvas are supported");
+ }
+
+ this.canvas = (javax.microedition.lcdui.Canvas) obj;
+
+ try {
+ sendPlayerEvent("doInitDisplayMode", null);
+ } catch (Exception e) {
+ }
+
+
+
return null;
}
- public void setDisplayFullScreen(boolean flag) throws MediaException {
- // TODO Auto-generated method stub
+ public void setDisplayFullScreen(boolean fullScreen) throws MediaException {
+ checkDisplayState();
+
+ if (this.fullScreen != fullScreen) {
+ this.fullScreen = fullScreen;
+
+ updateView();
+ }
}
- public void setDisplayLocation(int i, int j) {
- // TODO Auto-generated method stub
+ public void setDisplayLocation(int x, int y) {
+ checkDisplayState();
+
+ displayX = x;
+ displayY = y;
+
+ updateView();
}
- public void setDisplaySize(int i, int j) throws MediaException {
- // TODO Auto-generated method stub
+ public void setDisplaySize(int w, int h) throws MediaException {
+ checkDisplayState();
+
+ displayW = w;
+ displayH = h;
+
+ updateView();
}
public void setVisible(boolean flag) {
- // TODO Auto-generated method stub
+ checkDisplayState();
+
+ try {
+ sendPlayerEvent("doSetVisible", flag);
+ } catch (MediaException e)
+ {
+ }
}
public String getContentType() {
@@ -143,5 +215,129 @@
return null;
}
+ private void checkDisplayState() {
+ if (preview == null) {
+ throw new IllegalStateException("initDisplayMode not called yet");
+ }
+ }
+ private void updateView() {
+ if (fullScreen) {
+ preview.layout(0, 0, canvas.getWidth(), canvas.getHeight());
+ } else {
+ preview.layout(displayX, displayY, displayX + displayW, displayY + displayH);
+ }
+ }
+
+ @Override
+ void doPlayerEvent(String evt, Object evtData) throws MediaException {
+ super.doPlayerEvent(evt, evtData);
+
+ if (evt == "doInitDisplayMode") {
+ Context context = canvas.getView().getContext();
+ preview = new Preview(context);
+ preview.setLayoutParams(new LayoutParams(200, 100));
+
+ if (displayW <= 0) {
+ displayW = canvas.getWidth();
+ }
+
+ if (displayH <= 0) {
+ displayH = canvas.getHeight();
+ }
+
+ updateView();
+ }
+ else if (evt == "doSetVisible") {
+ boolean flag = (Boolean) evtData;
+ if (flag) {
+ canvas.addOverlayView(preview);
+ }
+ else {
+ canvas.removeOverlayView(preview);
+ }
+
+ System.out.println(">>>>>>>>>>>>>>> Invalidate > " + flag);
+ preview.invalidate();
+ canvas.getView().getRootView().invalidate();
+ }
+ }
+
+
+ class Preview extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {
+
+ Preview(Context context) {
+ super(context);
+
+ System.out.println(">>>> SurfaceView constructor <<<<");
+
+ // Install a SurfaceHolder.Callback so we get notified when the
+ // underlying surface is created and destroyed.
+ SurfaceHolder mHolder = getHolder();
+ mHolder.addCallback(this);
+ mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ System.out.println(">>>> surfaceCreated <<<<");
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+
+ System.out.println(">>>> surfaceDestroyed <<<<");
+
+ camera.setPreviewCallback(null);
+ camera.stopPreview();
+ camera.release();
+ camera = null;
+ }
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+ // Now that the size is known, set up the camera parameters and begin
+ // the preview.
+
+ System.out.println(">>>>1a surfaceChanged <<<<");
+ if (camera == null) {
+ camera = Camera.open();
+ camera.setPreviewCallback(this);
+ }
+ System.out.println(">>>>4a surfaceChanged");
+
+ System.out.println(">>>>1 surfaceChanged");
+
+ try {
+ System.out.println(">>>>2a surfaceChanged");
+ camera.setPreviewDisplay(holder);
+ System.out.println(">>>>3a surfaceChanged");
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ camera.startPreview();
+ System.out.println(">>>>2 surfaceChanged");
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ System.out.println(">>>>>>>>>>>>>>> draw");
+ super.draw(canvas);
+ Paint p = new Paint(Color.RED);
+ canvas.drawText("PREVIEW", canvas.getWidth() / 2, canvas.getHeight() / 2, p);
+ }
+
+
+ int x, y;
+ public void onPreviewFrame(byte[] data, Camera arg1) {
+ //invalidate();
+ //System.out.println("...");
+ x++;
+ y++;
+ if (x > 100) x = 1;
+ if (y > 100) y = 1;
+ super.layout(x, y, getWidth() + x, getHeight() + y);
+ //super.setPadding(x, y, 0, 0);
+ }
+ }
+
+
}
Modified: AndroidME/src_MIDP/javax/microedition/lcdui/Canvas.java
===================================================================
--- AndroidME/src_MIDP/javax/microedition/lcdui/Canvas.java 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/src_MIDP/javax/microedition/lcdui/Canvas.java 2010-04-21 17:41:30 UTC (rev 813)
@@ -10,9 +10,11 @@
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewGroup.LayoutParams;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
+import android.widget.LinearLayout;
public abstract class Canvas extends Displayable {
public static final int UP = 1;
@@ -39,11 +41,16 @@
public static final int KEY_STAR = 42;
public static final int KEY_POUND = 35;
+ private LinearLayout linearLayout;
private CanvasView canvasView;
private Bitmap graphicsBitmap;
protected Canvas() {
+ this.linearLayout = new LinearLayout(AndroidMeMIDlet.DEFAULT_ACTIVITY);
this.canvasView = new CanvasView(AndroidMeMIDlet.DEFAULT_ACTIVITY);
+
+ canvasView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
+ linearLayout.addView(canvasView);
}
public void setFullScreenMode(boolean fullScreen) {
@@ -170,19 +177,19 @@
@Override
public View getView() {
- return this.canvasView;
+ return this.linearLayout;
}
@Override
public void disposeDisplayable() {
-// this.canvasView = null;
+// JP this.canvasView = null;
}
@Override
public void initDisplayable(MIDlet midlet) {
- if (this.canvasView == null) {
- this.canvasView = new CanvasView(midlet.getActivity());
- }
+// JP if (this.canvasView == null) {
+// this.canvasView = new CanvasView(midlet.getActivity());
+// }
}
protected javax.microedition.lcdui.Graphics getGraphics() {
@@ -474,4 +481,12 @@
public void setTitle(Object object) {
// TODO Auto-generated method stub
}
+
+ public void addOverlayView(View v) {
+ linearLayout.addView(v);
+ }
+
+ public void removeOverlayView(View v) {
+ linearLayout.removeView(v);
+ }
}
Modified: AndroidME/src_MIDP/javax/microedition/media/Player.java
===================================================================
--- AndroidME/src_MIDP/javax/microedition/media/Player.java 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/src_MIDP/javax/microedition/media/Player.java 2010-04-21 17:41:30 UTC (rev 813)
@@ -1,25 +1,25 @@
package javax.microedition.media;
public interface Player extends Controllable {
- static int CLOSED = 1;
- static int PREFETCHED = 2;
- static int REALIZED = 3;
- static int STARTED = 4;
- static long TIME_UNKNOWN = 5;
- static int UNREALIZED = 6;
-
- void addPlayerListener(PlayerListener playerListener);
+ static int CLOSED = 0;
+ static int UNREALIZED = 100;
+ static int REALIZED = 200;
+ static int PREFETCHED = 300;
+ static int STARTED = 400;
+ static long TIME_UNKNOWN = -1l;
+
+ void addPlayerListener(PlayerListener playerListener);
void close() ;
void deallocate() ;
String getContentType() ;
long getDuration() ;
- long getMediaTime();
- int getState() ;
- void prefetch() throws MediaException;
- void realize() throws MediaException;
- void removePlayerListener(PlayerListener playerListener);
- void setLoopCount(int count);
- long setMediaTime(long now) throws MediaException;
- void start() throws MediaException;
- void stop() throws MediaException;
+ long getMediaTime();
+ int getState() ;
+ void prefetch() throws MediaException;
+ void realize() throws MediaException;
+ void removePlayerListener(PlayerListener playerListener);
+ void setLoopCount(int count);
+ long setMediaTime(long now) throws MediaException;
+ void start() throws MediaException;
+ void stop() throws MediaException;
}
Modified: AndroidME/src_MIDP/javax/microedition/media/PlayerListener.java
===================================================================
--- AndroidME/src_MIDP/javax/microedition/media/PlayerListener.java 2010-04-21 17:17:39 UTC (rev 812)
+++ AndroidME/src_MIDP/javax/microedition/media/PlayerListener.java 2010-04-21 17:41:30 UTC (rev 813)
@@ -2,14 +2,14 @@
public interface PlayerListener {
static String CLOSED = "closed";
- static String DEVICE_AVAILABLE = "device available";
- static String DEVICE_UNAVAILABLE = "device unavailable";
- static String DURATION_UPDATED = "duration updated";
- static String END_OF_MEDIA = "end of media";
+ static String DEVICE_AVAILABLE = "deviceAvailable";
+ static String DEVICE_UNAVAILABLE = "deviceUnavailable";
+ static String DURATION_UPDATED = "durationUpdated";
+ static String END_OF_MEDIA = "endOfMedia";
static String ERROR = "error";
static String STARTED = "started";
static String STOPPED = "stopped";
- static String VOLUME_CHANGED = "volume changed";
+ static String VOLUME_CHANGED = "volumeChanged";
void playerUpdate(Player player, String event, Object eventData);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|