Starting Video Camera with Intent

14,391

Solution 1

You will not believe how easy the solution was. First the motorola droid's camera app is com.google.android.camera. This is the standard android 2.2 package name. I used adb to pull the file from /data/system/packages.xml to confirm this.

Also there is an intent to open the camera app in video recorder mode. INTENT_ACTION_VIDEO_CAPTURE.

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

This is the intent to use to call the camera app in video mode.

Solution 2

As Thorstenvv points out; avoid starting Intents with explicit component names, unless they're inside your app. Doing so may break your app in different Android versions.

Rather, use the methods that appear in the docs.

To start the camera for videos only:

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

Read the result on your 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);
    }
}

Solution 3

Motorola has put their own camera app on the Droid, so the activity is a different one. On my Milestone (European version of Droid), the class is com.motorola.Camera.Camcorder.

This example shows you that you cannot rely on using the intent mechanism with fixed package and class name strings if there is no common intent action in Android SDK for a certain task - which is unfortunately the case for calling the video camera. The activity that you need to call for the video camera can and will be different on various phone types (potentially even among the same phone model if modified by the user).

You can however launch the default (still) camera app by sending an ordered broadcast with 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);
Share:
14,391
Phobos
Author by

Phobos

Learning IOS programming

Updated on June 05, 2022

Comments

  • Phobos
    Phobos almost 2 years

    I am writing a very small app that just opens the camera app ready for video. I am able to get my code to work on an Android 2.2 emulator, but it will not work on my device, Motorola Droid 1 stock 2.2 FRG22D. Any ideas where I went wrong on this code?

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

    It appears ThorstenW is correct. I would upvote your answer if I had enough rep. You can see from the logcat that com.android.camera could not be found and throws a fatal exception. Logcat below.

    D/dalvikvm( 1159): GC_EXTERNAL_ALLOC freed 251 objects / 13456 bytes in 66ms I/ActivityManager( 1086): Starting activity: Intent { act=android.intent.action. MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.goatpen.Phobo s.QSVideo/.StartVid } I/ActivityManager( 1086): Start proc com.goatpen.Phobos.QSVideo for activity com .goatpen.Phobos.QSVideo/.StartVid: pid=483 uid=10092 gids={}

    E/AndroidRuntime( 483): java.lang.RuntimeException: Unable to start activity Co mponentInfo{com.goatpen.Phobos.QSVideo/com.goatpen.Phobos.QSVideo.StartVid}: and roid.content.ActivityNotFoundException: Unable to find explicit activity class { com.android.camera/com.android.camera.VideoCamera}; have you declared this activ ity in your AndroidManifest.xml?

    E/AndroidRuntime( 483): Caused by: android.content.ActivityNotFoundException: U nable to find explicit activity class {com.android.camera/com.android.camera.Vid eoCamera}; have you declared this activity in your AndroidManifest.xml?

    • Cristian
      Cristian over 13 years
      can you paste the logcat generated by your motorola?
  • Phobos
    Phobos over 13 years
    So there is no way to start the video camera from an intent? I just want to write a very small app to use as a shortcut for the video camera. Since the default is to open the process in still camera mode. Thanks for your help. I would upvote your answer if I had enough rep. P.S. I pasted the exceptions from the logcat above.
  • Thorstenvv
    Thorstenvv over 13 years
    Great, I learned something new today. However, the intent as you wrote it does not resolve on a Motorola Milestone 2.1-update1. The correct way is to use the SDK constant MediaStore.ACTION_VIDEO_CAPTURE, which resolves to "android.media.action.VIDEO_CAPTURE".
  • Phobos
    Phobos over 13 years
    Thanks for the clarification. I always try to answer my questions if I can. So far I am loving android. I haven't written any code since Pascal. Object Oriented Programming and intents are new to me. Thanks for the rep.