我的问题......我从第三方应用程序访问了相机应用程序,然后我拍了一张照片。然后我进入菜单,我在menuitem(MENUITEM_CAMERA_PREVIEW)中添加了。我的菜单项必须执行一项功能,一旦它有我希望我的应用程序关闭相机并打开相机应用程序之前打开previose屏幕。
我遇到与此主题相同的问题: http://supportforums.blackberry.com/t5/Java-Development/How-to-exit-camera-app-properly/m-p/1924127#M209092
有人可以告诉我他们理解解决方案,如果没有,你可能知道解决方案,你的帮助将不胜感激。
我看过这些帖子: Closing the default camera in Blackberry programatically after taking a picture
How to exit a blackberry application from another application programatically?
但是我不确定从第三方应用程序退出相机应用程序应该添加什么。
有人可以帮我理解......
答案 0 :(得分:0)
尝试从应用中关闭相机应用程序非常棘手。我不知道干净的方法,但是I have done it this way。
基本上,您的应用需要请求权限
ApplicationPermissions.PERMISSION_INPUT_SIMULATION
注入击键。然后它会模拟按 ESC 键,这是用户手动关闭相机应用程序的方式。为了使这种技术更可靠,我需要让代码(有条件地)多次注入ESC密钥。
我使其更可靠的方式是我的应用中显示Screen
,之前我启动了相机应用。然后我监视该屏幕以查看它何时再次暴露。当我检测到它已被曝光时,我认为我必须注入足够的 ESC键序列来关闭相机(或者我猜用户可能已按下 ESC 本身,回到我的应用程序)。
更新:以下评论,这是我在此解决方案中使用的一些其他代码,通过监控下面某个屏幕的公开状态来检测正确的相机关闭它:
private boolean _isExposed = false;
protected void onExposed() {
super.onExposed();
_isExposed = true;
}
protected void onObscured() {
super.onObscured();
_isExposed = false;
}
public boolean isExposed() {
return _isExposed;
}
如果您愿意,也可以使用首先打开相机应用的方法将_isExposed
设置为false。
答案 1 :(得分:0)
这是我最终使用的代码,它更好。
public class MyScreen extends MainScreen{
Player _p;
VideoControl _videoControl;
FileConnection fileconn;
String PATH;
String GetfileName;
LabelField GetPhotofileName = new LabelField("",LabelField.FOCUSABLE){
protected boolean navigationClick(int status, int time){
Dialog.alert("Clicked");
return true;
}
};
public static boolean SdcardAvailabulity() {
String root = null;
Enumeration e = FileSystemRegistry.listRoots();
while (e.hasMoreElements()) {
root = (String) e.nextElement();
if( root.equalsIgnoreCase("sdcard/") ) {
return true;
}else if( root.equalsIgnoreCase("store/") ) {
return false;
}
}
class MySDListener implements FileSystemListener {
public void rootChanged(int state, String rootName) {
if( state == ROOT_ADDED ) {
if( rootName.equalsIgnoreCase("sdcard/") ) {
}
} else if( state == ROOT_REMOVED ) {
}
}
}
return true;
}
protected boolean invokeAction(int action){
boolean handled = super.invokeAction(action);
if(SdcardAvailabulity()){
PATH = System.getProperty("fileconn.dir.memorycard.photos")+"Image_"+System.currentTimeMillis()+".jpg";//here "str" having the current Date and Time;
} else {
PATH = System.getProperty("fileconn.dir.photos")+"Image_"+System.currentTimeMillis()+".jpg";
}
if(!handled){
if(action == ACTION_INVOKE){
try{
byte[] rawImage = _videoControl.getSnapshot(null);
fileconn=(FileConnection)Connector.open(PATH);
if(fileconn.exists()){
fileconn.delete();
}
fileconn.create();
OutputStream os=fileconn.openOutputStream();
os.write(rawImage);
GetfileName =fileconn.getName();
fileconn.close();
os.close();
Status.show("Image is Captured",200);
GetPhotofileName.setText(GetfileName);
if(_p!=null)
_p.close();
}catch(Exception e){
if(_p!=null){
_p.close();
}
if(fileconn!=null){
try{
fileconn.close();
}catch (IOException e1){
}
}
}
}
}
return handled;
}
public MyScreen(){
setTitle("Camera App");
try{
_p = javax.microedition.media.Manager.createPlayer("capture://video?encoding=jpeg&width=1024&height=768");
_p.realize();
_videoControl = (VideoControl) _p.getControl("VideoControl");
if (_videoControl != null){
Field videoField = (Field) _videoControl.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field");
_videoControl.setDisplayFullScreen(true);
_videoControl.setVisible(true);
_p.start();
if(videoField != null){
add(videoField);
}
}
}catch(Exception e){
if(_p!=null) {
_p.close();
}
Dialog.alert(e.toString());
}
add(GetPhotofileName);
}
}