代码之家  ›  专栏  ›  技术社区  ›  Phobos

有意启动摄像机

  •  2
  • Phobos  · 技术社区  · 16 年前

    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。

    I/ActivityManager(1086):启动活动:Intent{act=android.intent.action操作. 主cat=[android.intent.category类别.LAUNCHER]flg=0x10200000 cmp=com.goatpen.Phobo网站 s、 QSVideo/.StartVid} I/ActivityManager(1086):启动过程火卫一活动com的.QSVideo .goatpen.Phobos.qs视频/.StartVid:pid=483 uid=10092 gids={}

    组件信息{火卫一.qs视频/火卫一.QSVideo.StartVid文件}:和 roid.content.ActivityNotFoundException异常:找不到显式活动类{ com.android.camera/com.android.camera.摄像机}你宣布这项活动了吗

    E/AndroidRuntime(483):由以下原因引起:android.content.ActivityNotFoundException异常:U个 无法找到显式活动类{com.android.camera/com.android.camera.Vid视频

    3 回复  |  直到 16 年前
        1
  •  4
  •   Phobos    16 年前

    你不会相信解决问题有多容易。首先,摩托罗拉droid的摄像头应用程序是com.google.android网站相机。这是标准的android2.2包名。我使用adb从/data/system中提取文件/包.xml来证实这一点。

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

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

        2
  •  3
  •   Community Mohan Dere    9 年前

    作为 Thorstenvv points out ;避免使用显式组件名称启动意图,除非它们在应用程序中。这样做可能会破坏不同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);
        }
    }
    

    在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);
        }
    }
    
        3
  •  2
  •   Thorstenvv    16 年前

    这个例子向您展示了,如果Android SDK中没有针对某个任务的通用意图操作,那么您就不能依赖于使用带有固定包和类名字符串的意图机制——不幸的是,调用摄像机就是这种情况。您需要调用摄像机的活动在不同类型的手机上可能会有所不同(如果用户修改,甚至可能在同一型号的手机中)。

    但是,您可以通过发送带有ACTION\u camera\u按钮的有序广播来启动默认(静态)相机应用程序。

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