用意图启动摄像机

时间:2010-09-20 03:50:17

标签: android video permissions camera android-intent

我正在写一个非常小的应用程序,只是打开相机应用程序准备视频。我可以让我的代码在Android 2.2模拟器上运行,但它不适用于我的设备,摩托罗拉Droid 1股票2.2 FRG22D。我在这段代码上出错的任何想法?

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();

看来ThorstenW是正确的。如果我有足够的代表,我会支持你的答案。您可以从logcat中看到无法找到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 = 0x10200000 cmp = com.goatpen.Phobo s.QSVideo / .StartVid} I / ActivityManager(1086):为活动com启动proc com.goatpen.Phobos.QSVideo .goatpen.Phobos.QSVideo / .StartVid: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中声明这个活动?

3 个答案:

答案 0 :(得分:4)

你不会相信解决方案有多容易。首先,motorola droid的相机应用程序是com.google.android.camera。这是标准的android 2.2软件包名称。我使用adb从/data/system/packages.xml中提取文件以确认这一点。

此外,还有意在录像机模式下打开相机应用程序。 INTENT_ACTION_VIDEO_CAPTURE。

 Intent intent = new Intent("android.media.action.VIDEO_CAMERA");

这是用于在视频模式下调用相机应用程序的意图。

答案 1 :(得分:3)

作为Thorstenvv points out;避免使用显式组件名称启动Intents,除非它们在您的应用程序中。这样做可能会破坏您在不同Android版本中的应用。

相反,请使用methods that appear in the docs.

仅为视频启动相机:

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);
    }
}

阅读Activity onActivityResult上的结果:

@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);
    }
}

答案 2 :(得分:2)

摩托罗拉已将自己的相机应用程序放在Droid上,因此活动是另一回事。在我的里程碑(欧洲版Droid)上,该课程为com.motorola.Camera.Camcorder。

此示例向您显示,如果在Android SDK中没有针对特定任务的常见意图操作,则不能依赖于使用具有固定包和类名字符串的意图机制 - 不幸的是,调用摄像机的情况就是如此。您需要为摄像机调用的活动在各种电话类型上可能会有所不同(如果用户修改,甚至可能在同一个电话型号中)。

然而,您可以通过发送带有ACTION_CAMERA_BUTTON的有序广播来启动默认(静止)相机应用。

                    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);