音频播放
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015170238760.png)
一、MediaPlayer实现简易的音乐播放器
1、需要注意的点
- 访问 sd 卡的权限要开启
- 点击停止按钮后的状态的重置
- 资源的释放
2、代码实现
public class MainActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
private boolean isPaused = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageButton play = (ImageButton) findViewById(R.id.play);
ImageButton stop = (ImageButton) findViewById(R.id.stop);
final File file = new File("/sdcard/chen.mp3");
if (file != null) {
mediaPlayer = MediaPlayer.create(this, Uri.parse(file.getAbsolutePath()));
}
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPaused) {
mediaPlayer.start();
((ImageButton) v).setImageResource(R.drawable.pause);
isPaused = false;
} else {
mediaPlayer.pause();
((ImageButton) v).setImageResource(R.drawable.play);
isPaused = true;
}
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
play.setImageResource(R.drawable.play);
isPaused = true;
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(file.getAbsolutePath());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
}
二、SoundPool实现手机铃声选择界面
1、MediaPlayer 和 SoundPool 比较
- soundpool的缺点在于只适合播放比较短促的音频
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015104756124.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0YW53dWM=,size_16,color_FFFFFF,t_70)
1、关键点
- listView 实现列表界面
- AudioAttrubutes 和 SoundPool 设置相关属性
- HashMap 保存音频文件
2、代码实现
- 使用 SoundPool 一定是先 load 后 play
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.lv1);
AudioAttributes attributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
final SoundPool soundPool = new SoundPool.Builder()
.setAudioAttributes(attributes)
.setMaxStreams(10)
.build();
final HashMap<Integer, Integer> audioMap = new HashMap<>();
audioMap.put(0, soundPool.load(this, R.raw.cuckoo, 1));
audioMap.put(1, soundPool.load(this, R.raw.chimes, 1));
audioMap.put(2, soundPool.load(this, R.raw.notify, 1));
audioMap.put(3, soundPool.load(this, R.raw.ringout, 1));
audioMap.put(4, soundPool.load(this, R.raw.bird, 1));
audioMap.put(5, soundPool.load(this, R.raw.water, 1));
audioMap.put(6, soundPool.load(this, R.raw.cock, 1));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
soundPool.play(audioMap.get(position), 1, 1, 0, 0, 1);
}
});
}
}
视频播放
一、使用VideoView播放视频
- 使用 MediaController 添加一个播放控制条
public class MainActivity extends AppCompatActivity {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView = (VideoView) findViewById(R.id.video);
File file = new File(Environment.getExternalStorageDirectory() + "/video.mp4");
if (file.exists()) {
videoView.setVideoPath(file.getAbsolutePath());
} else {
Toast.makeText(this, "video is not exist", Toast.LENGTH_SHORT).show();
return;
}
MediaController controller = new MediaController(this);
videoView.setMediaController(controller);
videoView.requestFocus();
videoView.start();
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Toast.makeText(MainActivity.this, "video play complete", Toast.LENGTH_SHORT).show();
}
});
}
}
二、使用MediaPlayer+SurfaceView播放视频
1、基本思路
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015161634741.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0YW53dWM=,size_16,color_FFFFFF,t_70)
2、代码实现
public class MainActivity extends AppCompatActivity {
private ImageButton play, pause, stop;
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private SurfaceHolder videoHolder;
private boolean noPlay = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = (ImageButton) findViewById(R.id.btn_play);
pause = (ImageButton) findViewById(R.id.btn_pause);
stop = (ImageButton) findViewById(R.id.btn_stop);
surfaceView = (SurfaceView) findViewById(R.id.video_display);
videoHolder = surfaceView.getHolder();
mediaPlayer = new MediaPlayer();
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (noPlay) {
play();
noPlay = false;
} else {
mediaPlayer.start();
}
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!noPlay) {
mediaPlayer.pause();
}
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!noPlay) {
mediaPlayer.stop();
noPlay = true;
}
}
});
}
private void play() {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/video.mp4");
mediaPlayer.setDisplay(videoHolder);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<SurfaceView
android:id="@+id/video_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000"
android:orientation="horizontal">
<ImageButton
android:id="@+id/btn_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#00000000"
android:src="@drawable/btn_play" />
<ImageButton
android:id="@+id/btn_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#00000000"
android:src="@drawable/btn_pause" />
<ImageButton
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#00000000"
android:src="@drawable/btn_stop" />
</LinearLayout>
</LinearLayout>
使用摄像头
一、拍照
- 通过takePicture里面的回调来保存图片,需要通知图库更新
- 保存图片到存储设备,需要先检查是否挂载 sd 卡
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191015170210863.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0YW53dWM=,size_16,color_FFFFFF,t_70)
关键代码
public class MainActivity extends AppCompatActivity {
private ImageButton preview, takePhoto;
private SurfaceView surfaceView;
private boolean isPreview = false;
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "sdcard is not mounted", Toast.LENGTH_SHORT).show();
}
preview = (ImageButton) findViewById(R.id.preview);
takePhoto = (ImageButton) findViewById(R.id.takePhoto);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
final SurfaceHolder sh = surfaceView.getHolder();
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
camera = Camera.open();
preview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
camera.setPreviewDisplay(sh);
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setJpegQuality(100);
camera.setParameters(parameters);
camera.startPreview();
camera.autoFocus(null);
isPreview = true;
} catch (IOException e) {
e.printStackTrace();
}
}
});
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (camera != null) {
camera.takePicture(null, null, pictureCallback);
}
}
});
}
final Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
camera.stopPreview();
isPreview = false;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
File cameraDir = new File(Environment.getExternalStorageDirectory(), "/DCIM/Camera");
if (!cameraDir.exists()) {
cameraDir.mkdirs();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(cameraDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
MainActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse("file://" + "")));
Toast.makeText(MainActivity.this, "照片保存至:" + file, Toast.LENGTH_LONG).show();
resetCamera();
}
};
private void resetCamera() {
if (!isPreview) {
camera.startPreview();
isPreview = true;
}
}
@Override
protected void onPause() {
super.onPause();
if (camera != null) {
camera.stopPreview();
;
camera.release();
}
}
}
二、视频录制