2010-09-20 2 views
2

Я пишу очень маленькое приложение, которое просто открывает приложение для камеры, готовое для видео. Я могу заставить мой код работать на эмуляторе Android 2.2, но он не будет работать на моем устройстве, Motorola 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 освободил 251 объект/13456 байт за 66 мс 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): Запустите proc com.goatpen.Phobos.QSVideo для активности ком .goatpen.Phobos.QSVideo/.StartVid: PID = 483 = 10092 UID ГИД = {}

Е/AndroidRuntime (483): java.lang.RuntimeException: Невозможно запустить активность Co mponentInfo {ком. goatpen.Phobos.QSVideo/com.goatpen.Phobos.QSVideo.StartVid}: и roid.content.ActivityNotFoundException: невозможно найти явный класс активности { com.android.camera/com.android.camera.VideoCamera}; вы объявили этот актив ity в своем AndroidManifest.xml?

E/AndroidRuntime (483): Вызванный: android.content.ActivityNotFoundException: U Nable найти явную активность класса {com.android.camera/com.android.camera.Vid eoCamera}; Вы объявили эту активность в своем AndroidManifest.xml?

+0

вы можете вставить LogCat, сгенерированного вашим моторола? – Cristian

ответ

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

Это намерение использовать приложение камеры в режиме видео.

+3

Отлично, сегодня я узнал что-то новое. Однако намерение, как вы его написали, не разрешается на Motorola Milestone 2.1-update1. Правильный способ - использовать константу MediaStore.CTION_VIDEO_CAPTURE SDK, которая разрешает «android.media.action.VIDEO_CAPTURE». – Thorstenvv

+0

Спасибо за разъяснение. Я всегда стараюсь ответить на мои вопросы, если смогу. До сих пор я люблю андроид. Я не написал никакого кода с Паскаля. Объектно-ориентированное программирование и намерения новы для меня. Спасибо за репутацию. – Phobos

2

Motorola установила собственное приложение для камеры на Droid, поэтому деятельность отличается. На моем Milestone (европейская версия 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); 
+0

Итак, нет способа запустить видеокамеру с намерением? Я просто хочу написать очень маленькое приложение для использования в качестве ярлыка для видеокамеры. Поскольку по умолчанию необходимо открыть процесс в режиме неподвижной камеры. Спасибо за вашу помощь. Я бы поднял ваш ответ, если бы у меня было достаточно репутации. Постскриптум Я вставил исключения из logcat выше. – Phobos

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

Прочитайте результат на вашей деятельности 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); 
    } 
} 
Смежные вопросы