我正在写一个非常小的应用程序,只是打开相机应用程序准备视频。我可以让我的代码在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中声明这个活动?
答案 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);