调用摄像头拍照。
新建一个CameraAlbumTest项目, 然后修改activity_main中的代码 添加一个按钮 和一个ImageView控件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"><Button android:id="@+id/btn_take_photo" android:text="调用相机拍照" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/iv_photo" android:layout_width="wrap_content" android:layout_height="wrap_content" />
修改MainActivity中的代码。
public class MainActivity extends AppCompatActivity {
public static final int TAKE_PHOTO = 1 ; //代表拍照 requestCode
private ImageView ivPhoto;
private Button btnTakePhoto;private Uri imgUri; // 图片的Uri @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intiView(); btnTakePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { File image = new File(getExternalCacheDir(),"photo.jpg"); try { if(image.exists()){//如果这个文件存在就把这个文件删除。 image.delete(); } image.createNewFile();//. 创建这个文件。 }catch (IOException e) { e.printStackTrace(); } // cn.zbuter.cameraalbumtest.provider 要与AndroidManifest中的provider中对应 imgUri = FileProvider.getUriForFile(MainActivity.this,"cn.zbuter.cameraalbumtest.provider",image); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); //需要加在这一行 来指定图片的输出地址 startActivityForResult(intent,TAKE_PHOTO); } }); } @Override protected void onActivityResult(int requestCode, int resultCode,Intent data) { //super.onActivityResult(requestCode, resultCode, data); switch (requestCode){ case TAKE_PHOTO: if(resultCode == RESULT_OK){ Bitmap bitmap= null; try { bitmap = BitmapFactory.decodeStream (getContentResolver().openInputStream(imgUri)); ivPhoto.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); } // Bundle bundle=data.getExtras(); // Bitmap bitmap= (Bitmap) bundle.get("data"); //这种方式得到的图片是经过压缩的 特别小。 } break; default: break; } } public void intiView(){ ivPhoto = (ImageView) findViewById(R.id.iv_photo); btnTakePhoto = (Button) findViewById(R.id.btn_take_photo); }
}
在res目录下新建一个xml文件夹,然后在这个文件夹下新建一个文件名为file_paths.xml 编辑这个资源文件如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android = "http://schemas.android.com/apk/res/android"> <external-path name="photos" path="" /> </paths>
external-path就是用来指定Uri共享的,那么属性值可以随便填写,path属性的值表示共享的具体路径, 这里设置为空就表示将整个SD卡进行共享。
在AndroidManifest文件中的application标签中注册内容提供器。
<provider android:authorities="cn.zbuter.cameraalbumtest.provider" android:name="android.support.v4.content.FileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider>
如果需要适配Android4.4以前的系统需要在manifest中声明应用冠梁目录的权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
从相册中选择图片。
修改MainActivity中的代码加入从相册中选择图片的逻辑 代码如下。
public class MainActivity extends AppCompatActivity { public static final int TAKE_PHOTO = 1 ; //代表拍照 requestCode public static final int CHOOSE_PHOTO = 2; //代表选择图片 requestCode private ImageView ivPhoto; private Button btnTakePhoto; private Button btnChoosePhoto; private Uri imgUri; // 图片的Uri @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intiView(); btnTakePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { File image = new File(getExternalCacheDir(),"photo.jpg"); try { if(image.exists()){//如果这个文件存在就把这个文件删除。 image.delete(); } image.createNewFile();//. 创建这个文件。 }catch (IOException e) { e.printStackTrace(); } // cn.zbuter.cameraalbumtest.provider 要与AndroidManifest中的provider中对应 imgUri = FileProvider.getUriForFile(MainActivity.this,"cn.zbuter.cameraalbumtest.provider",image); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); //需要加在这一行 来指定图片的输出地址 startActivityForResult(intent,TAKE_PHOTO); } }); btnChoosePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //判断权限 if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ //申请授权 ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1); }else{ openAlbum(); } } }); } public void openAlbum(){ Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); startActivityForResult(intent,CHOOSE_PHOTO); } @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){ openAlbum(); }else{ Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show(); } break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode,Intent data) { switch (requestCode) { case TAKE_PHOTO: if (resultCode == RESULT_OK) { Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream (getContentResolver().openInputStream(imgUri)); ivPhoto.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); } // Bundle bundle=data.getExtras(); // Bitmap bitmap= (Bitmap) bundle.get("data"); //这种方式得到的图片是经过压缩的 特别小。 } break; case CHOOSE_PHOTO: if (resultCode == RESULT_OK) { if(Build.VERSION.SDK_INT >=19){// Android 4.4以上版本 handleImageOnKitKat(data); }else{ handleImageforeKitKat(data); } } break; default: break; } } private void handleImageforeKitKat(Intent data){ Uri uri = data.getData(); String imagePath = getImagePath(uri,null); displayImage(imagePath); } private void handleImageOnKitKat(Intent data){ String imagePath = null; Uri uri = data.getData(); if(DocumentsContract.isDocumentUri(this,uri)){ //如果是document类型的uri就通过document id 处理 String docID = DocumentsContract.getDocumentId(uri); if("com.android.providers.media.documents".equals(uri.getAuthority())){ String id = docID.split(":")[1]; //解析出来的数字格式的id String selection = MediaStore.Images.Media._ID + "=" + id; //拼接 id = 123 格式 Log.i("BBBBBBBBBBBBBBBBBBBBBB", "selection: "+selection); imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection); Log.i("BBBBBBBBBBBBBBBBBBBBBB", "imagePath: "+imagePath); }else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){ Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docID)); imagePath = getImagePath(contentUri,null); } }else if ("content".equalsIgnoreCase(uri.getScheme())){ // 如果是content类型的uri imagePath = getImagePath(uri,null); }else if("file".equalsIgnoreCase(uri.getScheme())){//如果是File类型的uri直接获取图片的路径即可。 imagePath = uri.getPath(); } displayImage(imagePath); } private void displayImage(String imagePath){ if(imagePath != null){ Bitmap bitmap = BitmapFactory.decodeFile(imagePath); ivPhoto.setImageBitmap(bitmap); }else{ Toast.makeText(this, "图片加载错误", Toast.LENGTH_SHORT).show(); } } public String getImagePath(Uri uri, String selection){ String path = null; //通过Uri和selection来获取真实的图片路径 Cursor cursor = getContentResolver().query(uri,null,selection,null,null); if(cursor != null){ if(cursor.moveToNext()){ path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); } } cursor.close(); return path; } public void intiView(){ ivPhoto = (ImageView) findViewById(R.id.iv_photo); btnTakePhoto = (Button) findViewById(R.id.btn_take_photo); btnChoosePhoto = (Button) findViewById(R.id.btn_choose_photo); } }
由于在Android4.4版本开始选取相册中的图片不返回图片的真实Uri了,而是一个封装过的Uri.
播放多媒体文件,
在Android中播放音频文件一般都是使用mediaplayer类来实现的, 他对多种格式的音频文件提供了非常去那面的控制方法。,从而是的播放音乐的工作变为十分简单,下表列出了MediaPlayer类中的一些较为常用的方法
方法名 功能描述
setDataSource() 设置要播放的音频文件的位置。
prepare() 在开始播放之前调用这个方法完成准备工作。
start() 开始或继续播放音频。
pause() 暂停播放音频。
reset() 将 MediaPlayer 对象重置到刚刚创建的状态。
seekTo() 从指定的位置开始播放音频。
stop() 停止播放音频。调用这个方法后的 MediaPlayer 对象无法再播放音频。
release() 释放掉与 MediaPlayer 对象相关的资源。
isPlaying() 判断当前 MediaPlayer 是否正在播放音频。
getDuration() 获取载入的音频文件的时长。
MediaPlayer 首先要创建出以个MediaPlayer对象, 然后调用setDataSource()方法来设置音频文件的路径,在调用prepare()方法使MediaPlayer进入到准备状态,接下来调用start()方法就可以开始播放音频,调用pause()方法就会暂停,调用reset()方法就会停止播放。
创建一个PlayAudioTest项目, 修改activity_main中的代码添加三个按钮分别是开始暂停和重置。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_start" android:text="开始" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_pause" android:text="暂停" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_reset" android:text="重置" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
修改MainActivity中的代码如下:
public class MainActivity extends AppCompatActivity { private MediaPlayer player = new MediaPlayer(); private Button btnStart; private Button btnPause; private Button btnReset; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1); }else{ initMediaPlayer(); } btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //播放按钮点击 if(!player.isPlaying()){ player.start(); } } }); btnPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //暂停按钮点击 if(player.isPlaying()) { player.pause(); } } }); btnReset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //重置按钮点击 if(player.isPlaying()) { player.reset(); initMediaPlayer(); } } });
}
private void initMediaPlayer(){ try{ File file = new File(Environment.getExternalStorageDirectory(),"music.mp3"); Log.i("BBBBBBBBBBBBBB", "Environment.getExternalStorageDirectory(): "+Environment.getExternalStorageDirectory()); player.setDataSource(file.getPath()); player.prepare(); }catch(Exception e){ e.printStackTrace(); } } @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){ initMediaPlayer(); }else{ Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show(); finish(); } } } public void initView(){ btnStart = (Button) findViewById(R.id.btn_start); btnPause = (Button) findViewById(R.id.btn_pause); btnReset = (Button) findViewById(R.id.btn_reset); } }
- 声明权限 在 AndroidMifest
- 向模拟器的 /storage/emulated/0 目录中 存放music.mp3 文件。
播放视频文件。
播放视频文件其实并不比播放音频文件更加复杂。主要是由于使用一个VideoView来实现的,这个类将视频的显示和控制基于一身, 使我们借助他就可以完成一个简易的视频播放器, VideoView的用法和MediaPlayer也较为类似。主要由以下常用方法。
setVideoPath:设置要播放的视频文件的位置
start:开始或继续播放视频
pause:暂停播放视频
resume:将视频从头开始播放
seekTo:从指定的位置开始播放视频
isPlaying:判断当前是否正在播放视频
getDuration:获取载入的视频文件的时长
创建一个PlayVideoTest项目
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btn_start" android:text="播放" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_pause" android:text="暂停" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_replay" android:text="重播" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
MainActivity
public class MainActivity extends AppCompatActivity { private VideoView videoView; private Button btnStart; private Button btnPause; private Button btnRepaly; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击播放 if(!videoView.isPlaying()){ videoView.start(); } } }); btnPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击暂停 if(videoView.isPlaying()){ videoView.pause(); } } }); btnRepaly.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击重播 if(videoView.isPlaying()){ videoView.resume(); } } }); if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE} , 1); }else{ initVideo(); } } public void initVideo(){ File file = new File(Environment.getExternalStorageDirectory(), "video.mp4"); videoView.setVideoPath(file.getPath()); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch(requestCode){ case 1: if(grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED){ initVideo(); }else{ Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show(); finish(); } break; } } public void initView(){ btnPause = (Button)findViewById(R.id.btn_pause); btnStart = (Button) findViewById(R.id.btn_start); btnRepaly = (Button) findViewById(R.id.btn_replay); videoView = (VideoView) findViewById(R.id.video_view); } }
声明权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>