zoukankan      html  css  js  c++  java
  • Android 获取视频照片与刷新媒体库*

    1、获取本地所有视频

        public void getLoadMedia() {
            Cursor cursor = UILApplication.instance.getApplicationContext().getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);
            try {
                for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
                    int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)); // id
                    String displayName =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
                    String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM)); // 专辑
                    String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST)); // 艺术家
                    String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)); // 显示名称
                    String mimeType =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
                    String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); // 路径
                    long duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)); // 时长
                    long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)); // 大小
                    String resolution =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.RESOLUTION));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                cursor.close();
            }
        }

    2、获取拍照视频

     //create new Intent
                Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                try {
                    fileUri = Uri.fromFile(createMediaFile()); // create a file to save the video
                } catch (IOException e) {
                    e.printStackTrace();
                }
                intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  // set the image file name
                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
                // start the Video Capture Intent
                startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
    public static final String[] videoCursorCols = new String[] { MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.TITLE, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.ARTIST, MediaStore.Video.Media.ALBUM, MediaStore.Video.Media.RESOLUTION, MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DATA };
    
        public static Video fileUriForVideo(Activity activity, Uri uri) {
    
            Cursor cursor = activity.getContentResolver().query(uri, videoCursorCols, null, null, null);
    
            if (cursor == null || cursor.getCount() == 0) {
                return null;
            } else {
    
                Video video = new Video();
                cursor.moveToFirst();
                /* file name */
                if (cursor.getString(1) != null) {
                    video.setName(cursor.getString(1));
                }
                /* media name */
                if (cursor.getString(2) != null) {
                   video.setDisplayName(cursor.getString(2));
                }
                /* play duration */
                if (cursor.getString(3) != null) {
                    video.setTimelong((cursor.getInt(3) / 1000) + "s");
                }
                /* artist */
                if (cursor.getString(4) != null) {
                    video.setSinger(cursor.getString(4));
                }
                /* album */
                if (cursor.getString(5) != null) {
                    video.setAlbum(cursor.getString(5));
                }
                /* resolution */
                if (cursor.getString(6) != null) {
                    video.setResolution(cursor.getString(6));
                }
                /* media type */
                if (cursor.getString(7) != null) {
                    video.setMimeType(cursor.getString(7).trim());
                }
                /* media size */
                if (cursor.getString(8) != null) {
                    video.setDownfilesize(new java.text.DecimalFormat("#.00").format((cursor.getInt(8) / 1024.0 / 1024.0)) + " MB");
    
                }
                /* media file path */
                if (cursor.getString(9) != null) {
                    video.setVoiceurl(cursor.getString(9));
                }
                if (cursor != null) {
                    cursor.close();
                }
                return video;
            }
        }

     播放视频

     private void initView() {
            String url="http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8";
            VideoView videoView=findViewById(R.id.mVideoView);
            videoView.setVideoPath(url);
            videoView.requestFocus();
            videoView.start();
    }

    1、开始录制

    首先实例化一个MediaRecord对象,对其中开始设置。我在这里遇到的问题是时音频文件的存储位置。代码中getCacheDir得到的是内部缓存目录,这个目录可以通过file exploer看到,具体在data/data/app名称/cache。file exploer在windows->show view->other中找到。先打开它,在启动模拟器,刚开始启动时可以发现窗口中出现文件列表。

    private void StartAudio(){//开始录制         
             recorder = new MediaRecorder();  
             recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音  
             recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //内容输出格式  
             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
        
             //输出到缓存目录,此处可以添加上传录音的功能,也可以存到其他位置   
             audioFile = new File(getCacheDir(), "recoder"+ "_" + System.currentTimeMillis() + ".3gp");  
             recorder.setOutputFile(audioFile.getAbsolutePath());  
             try {  
                 recorder.prepare();  
             } catch (IOException e) {  
                 e.printStackTrace();  
             }  
             recorder.start();  
             record=true;  
             Log.i(tag,"开始录制!");  
             StartButton.setEnabled(false);
              StopButton.setEnabled(true);    
              PlayButton.setEnabled(false);
        }

    2、结束录制

    一开始运行时stop函数出现各种问题,后来总结可能是start函数根本没有运行。可惜我也是刚接触它,并不熟悉过程。之后查了很多文章,可以用Log.i进行输出,大致相当于C++中的printf函数。所以一定是要在start之后才能stop。

    private void StopAudio(){    //结束录制
            recorder.stop();        
            //recorder.reset();   //14:19添加修改
            recorder.release();
            Log.i(tag,"停止录制!");  
            record=false;
     
            //更新状态
            //PlayButton.setEnabled(true);
            StartButton.setEnabled(true);
            StopButton.setEnabled(false);        
            PlayButton.setEnabled(true);
        }
    private void PlayAudio(){
            player = new MediaPlayer();  
                try {  
                    player.setDataSource(audioFile.getAbsolutePath());  
                    player.prepare();  
                    player.start();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }      
             StartButton.setEnabled(true);
             StopButton.setEnabled(false);    
             PlayButton.setEnabled(false);
        }

    1.从本地相册获取照片:

    一般就是写出这个方法

    protected void getImageFromAlbum() {  
        Intent intent = new Intent(Intent.ACTION_PICK);  
        intent.setType("image/*");//相片类型  
        startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);  
    }  

    2.从照相机获取照片

    一般就是写出这个方法

    复制代码
    protected void getImageFromCamera() {  
       String state = Environment.getExternalStorageState();  
       if (state.equals(Environment.MEDIA_MOUNTED)) {  
           Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");     
           startActivityForResult(getImageByCamera, REQUEST_CODE_CAPTURE_CAMEIA);  
       } else {  
           Toast.makeText(getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();  
        }  
    }  
    复制代码

    写完这个方法后,一般我们还需要通过响应这个方法去获取图片

    复制代码
    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        if (requestCode == REQUEST_CODE_PICK_IMAGE) {             
           Uri uri = data.getData();  
           //to do find the path of pic  
                
        } else if (requestCode == REQUEST_CODE_CAPTURE_CAMEIA ) {             
           Uri uri = data.getData();  
           //to do find the path of pic  
       }
     } 
    复制代码

    但是,有时候我们会发现用相机拍摄获取照片的时候,得到的 uri 是 null 的,这是因为android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,可能有的相机能够通过  
    inten.getData()获取到uri
    然后再根据uri获取数据的路径,在封装成bitmap,但有时候有的相机获取到的是null的,这时候我们该怎么办呢?
    其实这时候我们就应该从bundle中获取数据,通过
    (Bitmap) bundle.get("data")
    获取到相机图片的bitmap数据。
    为了能够同时适应上述两种情况,我们这时候就应该在获取图片时做判断了。我们可以在响应的时候做一个判断:

    复制代码
    @Override  
       protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
           if (requestCode == REQUEST_CODE_PICK_IMAGE) {             
               Uri uri = data.getData();  
               //to do find the path of pic by uri  
           } else if (requestCode == REQUEST_CODE_CAPTURE_CAMEIA ) {             
             Uri uri = data.getData();  
             if(uri == null){  
                 //use bundle to get data  
                 Bundle bundle = data.getExtras();    
                   if (bundle != null) {                 
                     Bitmap  photo = (Bitmap) bundle.get("data"); //get bitmap
                   } else {           
                       Toast.makeText(getApplicationContext(), "err****", Toast.LENGTH_LONG).show();           
                      return;        
                   }    
             }else{  
                    //to do find the path of pic by uri  
             }   
        }  
    } 
    复制代码

    后面的过程就需要通过bitmap转化成相应的图片文件了。不过得到最终的图片是被压缩了的。如果我们想得到相机拍摄出来的原照片在

    Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
    之后我们直接讲文件先保存到指定的路径filepath,然后直接在
    onActivityResult(int requestCode, int resultCode, Intent data)
    中把filepath传递过去

    示例代码

    复制代码
    protected void getImageFromCamera() {  
            String state = Environment.getExternalStorageState();  
            if (state.equals(Environment.MEDIA_MOUNTED)) {  
                Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");  
                String out_file_path = Constant.SAVED_IMAGE_DIR_PATH;  
                File dir = new File(out_file_path);  
                if (!dir.exists()) {  
                    dir.mkdirs();  
                }  
                capturePath = Constant.SAVED_IMAGE_DIR_PATH + System.currentTimeMillis() + ".jpg";  
                getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(capturePath)));  
                getImageByCamera.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);  
                startActivityForResult(getImageByCamera, Constant.REQUEST_CODE_CAPTURE_CAMEIA);  
            }  
            else {  
                Toast.makeText(getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();  
            }  
        }  
    复制代码

     刷新媒体库

    1. 问题概述

    使用我们自己写的程序生成一张图像或者一段视频,存放在SD卡的某个位置下,之后打开系统自带媒体库(图库)无法找到对于的图像和视频。连上电脑打开相应文件夹也找不到相应的文件?但是当手机重启之后,不管是在媒体库里找还是连上电脑搜索都可以找到。这其中发生了啥?

    2. 问题原因

    Android 内部维护了很多数据库,比如媒体数据库、联系人数据库等等。你在生成视频后并没有将视频的位置添加到这个数据库中。所以找不到呗。但是系统在每次重启后会自动更新一遍数据库,所以重启就可以找到了。

    3. 如何解决

    android可以手动更新媒体数据库,通常的做法都是发送广播

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, dirUri));  //刷新sd卡
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,fileUri)); //刷新单个文件

    目前在android API 23下直接刷新SD卡是会报错的,被系统禁止了,我屡次使用刷新单个文件都不怎么见效果。网上有个人说采用广播的方式刷新文件是可以的,一般没效果都是因为文件路径没有写对。这个供各位参考。

    我实现媒体库数据的自动更新采用以下代码

    /*
     * Copyright (c) 2016. All rights reserved
     * Created by GH_HOME on 16-12-12 下午3:04
     * Last modified 16-12-12 下午2:41
     *
     */
    
    package com.test;
    import java.io.File;
    import android.content.Context;
    import android.media.MediaScannerConnection;
    import android.media.MediaScannerConnection.MediaScannerConnectionClient;
    import android.net.Uri;
    import android.util.Log;
    
    
    public class SingleMediaScanner implements MediaScannerConnectionClient  {
    
        private MediaScannerConnection mMs;
        private File mFile;
    
        public SingleMediaScanner(Context context, File f) {
            mFile = f;
            mMs = new MediaScannerConnection(context, this);
            mMs.connect();
        }
    
        @Override
        public void onMediaScannerConnected() {
            mMs.scanFile(mFile.getAbsolutePath(), null);
        }
    
        @Override
        public void onScanCompleted(String path, Uri uri) {
            mMs.disconnect();
            Log.i("TAG", "Finished scanning " + path);
        }
    
    }

    调用方式为

    new SingleMediaScanner(this, mOutputFile);

    其中this为你当前的activity,mOutputFile为你生成的文件。在文件生成之后调用即可。

  • 相关阅读:
    人间故事馆话题:聊聊那些被骗经历,让其他人不再被骗
    路过的风景
    路过的风景
    上海最适合拍照的旅游地点
    Java EE (11)
    五、服务器端的局域网
    P1294 高手去散步 洛谷
    堆排序【模板】
    P3383 【模板】线性筛素数 洛谷
    P1516 青蛙的约会 洛谷
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/5358552.html
Copyright © 2011-2022 走看看