Android Studio blank VideoView 无法播放模拟器中录制的视频
Android Studio blank VideoView does not playback video recorded in emulator
我正在尝试使用模拟器中的摄像头录制视频。录制后,我希望 VideoView 显示剪辑中 1 毫秒的预览图像。然后在 VideoView 上添加一个 MediaController。用户必须单击按钮才能创建意图以激活 ACTION_VIDEO_CAPTURE。请参见 UI 布局 here。
我可以在模拟器的相机应用程序中进行录制,但问题是我什至无法在 VideoView 中立即播放它。我怎样才能实现我在第一段中的目标?我没有从设备或 Logcat 中收到任何错误消息。录完就直接回到空白videoView。会不会是视频格式?
仅供参考,我在同一屏幕上有一个 ImageView,它工作得很好。
onCreate 方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_new_card);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Create a new activity card");
activity_title = findViewById(R.id.activity_title);
imageView = findViewById(R.id.imageView);
editText_hrs = findViewById(R.id.editText_hrs);
editText_mins = findViewById(R.id.editText_mins);
videoBtn = findViewById(R.id.uploadVideo);
videoView = findViewById(R.id.videoView);
checkbox = findViewById(R.id.check_useofitems);
createcard_done = findViewById(R.id.createcard_done);
drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
imageutils = new ImageUtils(this);
imageView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
imageutils.imagepicker(1);
}
});
videoUtils = new VideoUtils(this);
videoBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//videoUtils.videoPicker(1);
//videoView.setVideoURI(videoUtils.getVideoUri());
Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
if(videoIntent.resolveActivity(getPackageManager()) != null){
startActivityForResult(videoIntent, VIDEO_REQUEST);
}
}
});
videoView.setVideoURI(videoUri);
videoView.start();
onActivityResult 方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case 0:
imageutils.onActivityResult(requestCode, resultCode, data);
break;
case 1:
if (resultCode == RESULT_OK) {
videoUri = data.getData();
}
break;
}
}
好的,我设法解决了我的问题,谢天谢地。问题在于我如何处理 onActivityResult() 中的 requestCode 案例。我在同一个 activity 中有一个 ImageView 和 VideoView。我的 ImageView 和 VideoView 都允许用户从相机或画廊上传。
这是在 onCreate() 方法中处理 ImageView 和 VideoView 的代码:
imageutils = new ImageUtils(this);
imageView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
imageutils.imagepicker(1);
}
});
videoUtils = new VideoUtils(this);
videoBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
videoUtils.videoPicker(1);
}
});
在我的 ImageUtils class 中,我有一个 camera_call() 和一个 gallery_call():
public void camera_call() {
ContentValues values = new ContentValues();
imageUri = current_activity.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent1.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
current_activity.startActivityForResult(intent1, 0);
}
public void gallery_call() {
Intent intent2 = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent2.setType("image/*");
current_activity.startActivityForResult(intent2, 1);
}
并且在我的 VideoUtils class 中,我还有一个 camera_call() 和一个 gallery_call() :
public void camera_call() {
Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
current_activity.startActivityForResult(videoIntent, 2);
}
public void gallery_call() {
Intent intent2 = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
intent2.setType("video/*");
current_activity.startActivityForResult(intent2, 3);
}
如您所知,startActivityForResult 的参数如下:
startActivityForResult(意图,请求代码)。所以这就是我使用 onActivityResult():
处理 ImageView 和 VideoView 中相机和图库的不同请求代码的方式 activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK) {
if(requestCode == 0 || requestCode == 1) {
imageutils.onActivityResult(requestCode, resultCode, data);
}
if(requestCode == 2 || requestCode == 3) {
videoView.setVisibility(View.VISIBLE);
videoUri = data.getData();
videoView.setVideoURI(videoUri);
videoView.setFocusable(true);
videoView.seekTo(1);
MediaController mc = new MediaController(this);
videoView.setMediaController(mc);
Log.i("True", "Executed");
}
}
}
就是这样!现在我可以在 activity 中上传和显示图像,并在 activity 中上传和播放视频。
我正在尝试使用模拟器中的摄像头录制视频。录制后,我希望 VideoView 显示剪辑中 1 毫秒的预览图像。然后在 VideoView 上添加一个 MediaController。用户必须单击按钮才能创建意图以激活 ACTION_VIDEO_CAPTURE。请参见 UI 布局 here。
我可以在模拟器的相机应用程序中进行录制,但问题是我什至无法在 VideoView 中立即播放它。我怎样才能实现我在第一段中的目标?我没有从设备或 Logcat 中收到任何错误消息。录完就直接回到空白videoView。会不会是视频格式?
仅供参考,我在同一屏幕上有一个 ImageView,它工作得很好。
onCreate 方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_new_card);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Create a new activity card");
activity_title = findViewById(R.id.activity_title);
imageView = findViewById(R.id.imageView);
editText_hrs = findViewById(R.id.editText_hrs);
editText_mins = findViewById(R.id.editText_mins);
videoBtn = findViewById(R.id.uploadVideo);
videoView = findViewById(R.id.videoView);
checkbox = findViewById(R.id.check_useofitems);
createcard_done = findViewById(R.id.createcard_done);
drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
imageutils = new ImageUtils(this);
imageView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
imageutils.imagepicker(1);
}
});
videoUtils = new VideoUtils(this);
videoBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//videoUtils.videoPicker(1);
//videoView.setVideoURI(videoUtils.getVideoUri());
Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
if(videoIntent.resolveActivity(getPackageManager()) != null){
startActivityForResult(videoIntent, VIDEO_REQUEST);
}
}
});
videoView.setVideoURI(videoUri);
videoView.start();
onActivityResult 方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case 0:
imageutils.onActivityResult(requestCode, resultCode, data);
break;
case 1:
if (resultCode == RESULT_OK) {
videoUri = data.getData();
}
break;
}
}
好的,我设法解决了我的问题,谢天谢地。问题在于我如何处理 onActivityResult() 中的 requestCode 案例。我在同一个 activity 中有一个 ImageView 和 VideoView。我的 ImageView 和 VideoView 都允许用户从相机或画廊上传。
这是在 onCreate() 方法中处理 ImageView 和 VideoView 的代码:
imageutils = new ImageUtils(this);
imageView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
imageutils.imagepicker(1);
}
});
videoUtils = new VideoUtils(this);
videoBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
videoUtils.videoPicker(1);
}
});
在我的 ImageUtils class 中,我有一个 camera_call() 和一个 gallery_call():
public void camera_call() {
ContentValues values = new ContentValues();
imageUri = current_activity.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent1.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
current_activity.startActivityForResult(intent1, 0);
}
public void gallery_call() {
Intent intent2 = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent2.setType("image/*");
current_activity.startActivityForResult(intent2, 1);
}
并且在我的 VideoUtils class 中,我还有一个 camera_call() 和一个 gallery_call() :
public void camera_call() {
Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
current_activity.startActivityForResult(videoIntent, 2);
}
public void gallery_call() {
Intent intent2 = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
intent2.setType("video/*");
current_activity.startActivityForResult(intent2, 3);
}
如您所知,startActivityForResult 的参数如下: startActivityForResult(意图,请求代码)。所以这就是我使用 onActivityResult():
处理 ImageView 和 VideoView 中相机和图库的不同请求代码的方式 activity@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK) {
if(requestCode == 0 || requestCode == 1) {
imageutils.onActivityResult(requestCode, resultCode, data);
}
if(requestCode == 2 || requestCode == 3) {
videoView.setVisibility(View.VISIBLE);
videoUri = data.getData();
videoView.setVideoURI(videoUri);
videoView.setFocusable(true);
videoView.seekTo(1);
MediaController mc = new MediaController(this);
videoView.setMediaController(mc);
Log.i("True", "Executed");
}
}
}
就是这样!现在我可以在 activity 中上传和显示图像,并在 activity 中上传和播放视频。