Android 有目的地启动摄像机
我正在编写一个非常小的应用程序,只需打开摄像头应用程序即可进行视频拍摄。我可以让我的代码在安卓2.2模拟器上运行,但它不能在我的设备摩托罗拉Droid 1 stock 2.2 FRG22D上运行。你知道我在代码上哪里出错了吗Android 有目的地启动摄像机,android,video,permissions,camera,android-intent,Android,Video,Permissions,Camera,Android Intent,我正在编写一个非常小的应用程序,只需打开摄像头应用程序即可进行视频拍摄。我可以让我的代码在安卓2.2模拟器上运行,但它不能在我的设备摩托罗拉Droid 1 stock 2.2 FRG22D上运行。你知道我在代码上哪里出错了吗 public class StartVid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedIns
public class StartVid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final int VIDEO = 1;
Intent intent = new Intent();
intent.setClassName("com.android.camera","com.android.camera.VideoCamera");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, VIDEO );
finish();
看来托尔斯滕是对的。如果我有足够的代表,我会投票支持你的答案。你可以从日志中看到com.android.camera找不到,并抛出一个致命的异常。下面是Logcat
D/dalvikvm(1159):GC_EXTERNAL_ALLOC在66ms内释放251个对象/13456字节
I/ActivityManager(1086):启动活动:Intent{act=android.Intent.action。
MAIN cat=[android.intent.category.LAUNCHER]flg=0x10200000cmp=com.goatpen.Phobo
s、 QSVideo/.StartVid}
I/ActivityManager(1086):为activity com启动proc com.goatpen.Phobos.QSVideo
.goatpen.Phobos.QSVideo/.startvideo:pid=483 uid=10092 gids={}
E/AndroidRuntime(483):java.lang.RuntimeException:无法启动活动Co
mponentInfo{com.goatpen.Phobos.QSVideo/com.goatpen.Phobos.QSVideo.StartVid}:和
roid.content.ActivityNotFoundException:找不到显式活动类{
com.android.camera/com.android.camera.VideoCamera};你宣布这项活动了吗
在您的AndroidManifest.xml文件中是否存在重复性?
E/AndroidRuntime(483):原因:android.content.ActivityNotFoundException:U
无法找到显式活动类{com.android.camera/com.android.camera.Vid
eoCamera};您是否在AndroidManifest.xml中声明了此活动?摩托罗拉已在Droid上安装了自己的摄像头应用程序,因此此活动是不同的。在我的Milestone(Droid的欧洲版)上,课程是com.motorola.Camera.camcoder 这个例子向您展示了,如果Android SDK中没有针对特定任务的通用意图操作,那么您就不能依赖于使用带有固定包和类名字符串的意图机制——不幸的是,调用摄像机就是这种情况。在不同类型的手机上,您需要为摄像机呼叫的活动可能会有所不同(如果用户修改,甚至可能在同一型号的手机中) 但是,您可以通过使用ACTION_camera_按钮发送有序广播来启动默认(静态)摄像头应用程序
i = new Intent();
i.setFlags( Intent.FLAG_DEBUG_LOG_RESOLUTION);
i.setAction(Intent.ACTION_CAMERA_BUTTON);
i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CAMERA));
sendOrderedBroadcast(i, null);
你不会相信这个解决方案是多么容易。首先,摩托罗拉droid的摄像头应用程序是com.google.android.camera。这是标准的android 2.2软件包名称。我使用adb从/data/system/packages.xml中提取文件来确认这一点 此外,还打算在录像机模式下打开摄像头应用程序。意图\行动\视频\捕获
Intent intent = new Intent("android.media.action.VIDEO_CAMERA");
这是用于在视频模式下调用摄像头应用程序的目的 As;避免使用显式组件名称启动意图,除非它们在应用程序中。这样做可能会破坏不同Android版本中的应用程序
相反,使用
要仅为视频启动摄像头,请执行以下操作:
static final int REQUEST_VIDEO_CAPTURE = 1;
private void dispatchTakeVideoIntent() {
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
}
}
在ActivityResult上阅读活动的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
Uri videoUri = intent.getData();
mVideoView.setVideoURI(videoUri);
}
}
你能粘贴你的摩托罗拉公司生产的logcat吗?所以没有办法从一个意图启动摄像机?我只想写一个非常小的应用程序作为摄像机的快捷方式。因为默认设置是在静止相机模式下打开进程。谢谢你的帮助。如果我有足够的rep.P.S.我会更新你的答案。我粘贴了上面日志中的例外。太好了,我今天学到了一些新东西。然而,您所写的意图并不能解决摩托罗拉里程碑2.1-update1的问题。正确的方法是使用SDK常量MediaStore.ACTION\u VIDEO\u CAPTURE,它解析为“android.media.ACTION.VIDEO\u CAPTURE”。感谢您的澄清。如果可以的话,我总是尽量回答我的问题。到目前为止,我喜欢安卓。自从Pascal之后,我没有写过任何代码。面向对象编程和意图对我来说是新的。谢谢你的代表。