以下是视频播放源代码:
package com.example.c7contentprovider;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
import java.io.File;
import java.io.IOException;
/**
* Created by 邓苏桃 on 2017/7/4.
*/
public class VedioPlayerActivity extends AppCompatActivity implements View.OnClickListener {
private VideoView videoView;
MediaController mediaController;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.vedioplayer_main);
videoView= (VideoView) findViewById(R.id.video_view);
Button play = (Button) findViewById(R.id.vedio_play);
Button pause = (Button) findViewById(R.id.vedio_pause);
Button replay = (Button) findViewById(R.id.vedio_replay);
play.setOnClickListener(this);
pause.setOnClickListener(this);
replay.setOnClickListener(this);
if (ContextCompat.checkSelfPermission(VedioPlayerActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(VedioPlayerActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
initVideoPath();
}
}
private void initVideoPath() {
File file=new File("storage/sdcard1/shiping.mp4");
if(file.exists())
{
// Toast.makeText(this, "have found video", Toast.LENGTH_SHORT).show();
videoView.setVideoPath(file.getAbsolutePath());
// mediaController=new MediaController(this);
// videoView.setMediaController(mediaController);
// mediaController.setMediaPlayer(videoView);
// videoView.requestFocus();
// videoView.start();
}
else
{
Toast.makeText(this, file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode)
{
case 1:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED)
{
initVideoPath();
}
else
{
Toast.makeText(this, "You Denied the Permission", Toast.LENGTH_SHORT).show();
finish();
}
break;
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.vedio_play:
if (!videoView.isPlaying()){
videoView.start();
}
break;
case R.id.vedio_pause:
if (videoView.isPlaying()){
videoView.pause();
}
break;
case R.id.vedio_replay:
if (videoView.isPlaying()){
videoView.resume();
}
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (videoView!=null)
{
videoView.suspend();
}
}
}
关键问题在这里:
private void initVideoPath() {
File file=new File("storage/sdcard1/shiping.mp4");
...
...
按照《第一行代码》第八章给的代码应该写成这样:
File file=new File(Environment.getExternalStorageDirectory(),"shiping.mp4");
两者区别在于:
Environment.getExternalStorageDirectory()的实际文件路径是:storage/sdcard0/,而如果这样写则会显示找不到s**hiping.mp4**文件。网上百度才发现,sdcard0是内置存储,一般是手机U盘,sdcard1是外置存储,只手机上的sd卡。所以如果使用Environment.getExternalStorageDirectory(),应该把文件放在手机U盘上。