Android学习(八)

调用摄像头拍照。

  1. 新建一个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" />
    

  2. 修改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);
    }
    

    }

  3. 在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卡进行共享。

  4. 在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>
    
  5. 如果需要适配Android4.4以前的系统需要在manifest中声明应用冠梁目录的权限。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

从相册中选择图片。

  1. 修改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()方法就会停止播放。

  1. 创建一个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>
    
  2. 修改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);
        }
    }
    
  3. 声明权限 在 AndroidMifest

  1. 向模拟器的 /storage/emulated/0 目录中 存放music.mp3 文件。

播放视频文件。

播放视频文件其实并不比播放音频文件更加复杂。主要是由于使用一个VideoView来实现的,这个类将视频的显示和控制基于一身, 使我们借助他就可以完成一个简易的视频播放器, VideoView的用法和MediaPlayer也较为类似。主要由以下常用方法。

setVideoPath:设置要播放的视频文件的位置
start:开始或继续播放视频
pause:暂停播放视频
resume:将视频从头开始播放
seekTo:从指定的位置开始播放视频
isPlaying:判断当前是否正在播放视频
getDuration:获取载入的视频文件的时长
  1. 创建一个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>    
    
  2. 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);
        }
    }
    
  3. 声明权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    




原文地址:https://www.cnblogs.com/zbuter/p/10020983.html