安卓android.provider.MediaStore.ACTION_VIDEO_CAPTURE返回null onActivityResult具有承上启下7 [英] android android.provider.MediaStore.ACTION_VIDEO_CAPTURE return null onActivityResult with nexus 7

查看:330
本文介绍了安卓android.provider.MediaStore.ACTION_VIDEO_CAPTURE返回null onActivityResult具有承上启下7的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的意图录制视频。

所以我用下面的recordVideo按钮的点击code

  Videofilepath =;
意向意图=新的意图(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(意向,REQUEST_VIDEO_CAPTURED);
 

和在onActivityResult

 保护无效onActivityResult(INT申请code,INT结果code,意图数据){

        如果(结果code == Activity.RESULT_OK){
            开关(要求code){
            案例IMAGE_PICK:
                this.imageFromGallery(结果code,数据);
                打破;
            案例IMAGE_CAPTURE:
                this.imageFromCamera(结果code,数据);
                打破;
            案例REQUEST_VIDEO_CAPTURED:
                this.videoFromCamera(结果code,数据);

                打破;
            默认:
                打破;
            }
        }
    }


私人无效videoFromCamera(INT结果code,意图数据){
        uriVideo = data.getData();


        uploadedFileName =;
        Constant.IS_FILE_ATTACH = TRUE;

        Toast.makeText(PDFActivity.this,uriVideo.getPath(),Toast.LENGTH_LONG)
        。显示();
        的String [] filePathColumn = {MediaStore.Video.Media.DATA};

        光标光标= getContentResolver()查询(uriVideo,filePathColumn,
                NULL,NULL,NULL);
        cursor.moveToFirst();

        INT参数:columnIndex = cursor.getColumnIndex(filePathColumn [0]);
        字符串文件路径= cursor.getString(参数:columnIndex);
        Videofilepath =文件路径;
        的System.out.println(从相机Videofilepath文件路径:
                + Videofilepath);
        cursor.close();
        文件F =新的文件(文件路径);
        的System.out.println(文件创建:?+ f.exists());

        位图BMAP = NULL;
        做 {
            尝试 {
                //模拟网络接入。
                视频下载(3000);
            }赶上(InterruptedException异常E){
                e.printStackTrace();
            }
        }而(f.exists()!);
        BMAP = ThumbnailUtils.createVideoThumbnail(文件路径,
                MediaStore.Video.Thumbnails.MICRO_KIND);
        做 {
            尝试 {
                //模拟网络接入。
                视频下载(1000);
            }赶上(InterruptedException异常E){
                e.printStackTrace();
            }
        }而(BMAP == NULL);
        imageOrVideo =视频;
        attachmentvalue.setImageBitmap(BMAP);
    }
 

这code是工作的罚款与三星Galaxy Tab。但不工作的Nexus 7可能的Nexus 7有前置摄像头。  但我得到的结果数据的意图是空onActivityResult。

所以在我的logcat我得到了以下异常: -

  12月8号至8日:51:31.160:E / AndroidRuntime(10899):致命异常:主要
十二月8号至8号:51:31.160:E / AndroidRuntime(10899):java.lang.RuntimeException的:不提供结果ResultInfo {谁= NULL,请求= 200,结果= -1,数据=意向{}}到活动{COM .example.activity / com.example.PDFActivity}:显示java.lang.NullPointerException
 

解决方案

最后,我解决了这个问题。 的Nexus 7商店在 DCIM视频目录,但 onActivityResults 返回。它的一个记录的问题的Nexus 7设备。

所以解决这个问题 intent.putExtra(MediaStore.EXTRA_OUTPUT,了fileURI);
在code是因为: -

在录制按钮点击code: -

 意图=新的意图(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
   =了fileURI getOutputMediaFile(MEDIA_TYPE_VIDEO); //创建一个文件保存在指定文件夹的视频(这适用于视频只)
    intent.putExtra(MediaStore.EXTRA_OUTPUT,了fileURI);
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1); //设定视频图像质量高

    //启动视频捕捉意向
    startActivityForResult(意向,REQUEST_VIDEO_CAPTURED_NEXUS);
 

内部开关code - onActivityResult的情况下块: -

 保护无效onActivityResult(INT申请code,INT结果code,意图数据){

        如果(结果code == Activity.RESULT_OK){
            开关(要求code){
    案例REQUEST_VIDEO_CAPTURED_NEXUS:
    this.videoFromCameraNexus(结果code,数据);
    打破;

默认:
                打破;
            }
        }
    }
 

// videoFromCameraNexus方法

 私人无效videoFromCameraNexus(INT结果code,意图数据){

        如果(了fileURI!= NULL){
            Log.d(TAG,视频保存到:\ N+了fileURI);
            Log.d(TAG,视频路径:\ N+ fileUri.getPath());
            Log.d(TAG,视频名称:\ N+的getName(了fileURI));
    //使用uri.getLastPathSegment()如果存放在文件夹中
    //使用文件URI。
        }
    }
 

获取输出媒体文件URI以下方法

 公众开放的getOutputMediaFile(整型)
    {
        //为了安全起见,你应该检查SD卡安装

        如果(Environment.getExternalStorageState()!= NULL){
            //这适用于Android 2.2及以上
            文件mediaStorageDir =新的文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES),SMW_VIDEO);

            //这个位置效果最好,如果你希望共享的创建的图像
            //应用程序之间,坚持后,您的应用程序已被卸载。

            //创建存储目录,如果它不存在
            如果(!mediaStorageDir.exists()){
                如果(!mediaStorageDir.mkdirs()){
                    Log.d(TAG,未能创建目录);
                    返回null;
                }
            }

            //创建一个媒体文件名
            字符串的timeStamp =新的SimpleDateFormat(YYYYMMDD_HHMMSS)格式(新的Date())。
            文件媒体文件;
           如果(类型== MEDIA_TYPE_VIDEO){
                媒体文件=新的文件(mediaStorageDir.getPath()+文件分割符+
                VID _+的timeStamp +.MP4);
            } 其他 {
                返回null;
            }

            返回Uri.fromFile(媒体文件);
        }

        返回null;
    }
 

它为我工作。

I am using intent for record video.

so i use following code on recordVideo button's click

Videofilepath = "";
Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(intent,REQUEST_VIDEO_CAPTURED);

and in onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == Activity.RESULT_OK) {
            switch (requestCode) {
            case IMAGE_PICK:
                this.imageFromGallery(resultCode, data);
                break;
            case IMAGE_CAPTURE:
                this.imageFromCamera(resultCode, data);
                break;
            case REQUEST_VIDEO_CAPTURED:
                this.videoFromCamera(resultCode, data);

                break;
            default:
                break;
            }
        }
    }


private void videoFromCamera(int resultCode, Intent data) {
        uriVideo = data.getData();


        uploadedFileName="";
        Constant.IS_FILE_ATTACH = true;

        Toast.makeText(PDFActivity.this, uriVideo.getPath(), Toast.LENGTH_LONG)
        .show();
        String[] filePathColumn = { MediaStore.Video.Media.DATA };

        Cursor cursor = getContentResolver().query(uriVideo, filePathColumn,
                null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        Videofilepath = filePath;
        System.out.println("Videofilepath filepath from camera : "
                + Videofilepath);
        cursor.close();
        File f = new File(filePath);
        System.out.println("file created ? : " + f.exists());

        Bitmap bMap = null;
        do {
            try {
                // Simulate network access.
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } while (!f.exists());
        bMap = ThumbnailUtils.createVideoThumbnail(filePath,
                MediaStore.Video.Thumbnails.MICRO_KIND);
        do {
            try {
                // Simulate network access.
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } while (bMap == null);
        imageOrVideo = "video";
        attachmentvalue.setImageBitmap(bMap);
    }

This code is working fine with samsung galaxy Tab. But not working with Nexus 7. May be Nexus 7 have front camera. but i got resultant data intent is null onActivityResult.

so in my Logcat i got the following exception :-

08-08 12:51:31.160: E/AndroidRuntime(10899): FATAL EXCEPTION: main
08-08 12:51:31.160: E/AndroidRuntime(10899): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=200, result=-1, data=Intent {  }} to activity {com.example.activity/com.example.PDFActivity}: java.lang.NullPointerException

解决方案

Finally I resolved this issue. Nexus 7 Stores the videos in DCIM directory but onActivityResults it returns null. Its an documented issue with Nexus 7 device.

so fix this issue with intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
the code is as :-

code on record button click:-

  intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);    
   fileUri = getOutputMediaFile(MEDIA_TYPE_VIDEO);  // create a file to save the video in specific folder (this works for video only)
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high

    // start the Video Capture Intent
    startActivityForResult(intent, REQUEST_VIDEO_CAPTURED_NEXUS);

code inside switch - case block of onActivityResult :-

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == Activity.RESULT_OK) {
            switch (requestCode) {
    case REQUEST_VIDEO_CAPTURED_NEXUS:
    this.videoFromCameraNexus(resultCode, data);
    break;

default:
                break;
            }
        }
    }

// videoFromCameraNexus method

private void videoFromCameraNexus(int resultCode, Intent data) {

        if(fileUri != null) {
            Log.d(TAG, "Video saved to:\n" + fileUri);
            Log.d(TAG, "Video path:\n" + fileUri.getPath());
            Log.d(TAG, "Video name:\n" + getName(fileUri)); 
    // use uri.getLastPathSegment() if store in folder
    //use the file Uri.
        }
    }

Get the output Media file uri with the following Method

public Uri getOutputMediaFile(int type)
    {
        // To be safe, you should check that the SDCard is mounted

        if(Environment.getExternalStorageState() != null) {
            // this works for Android 2.2 and above
            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "SMW_VIDEO");

            // This location works best if you want the created images to be shared
            // between applications and persist after your app has been uninstalled.

            // Create the storage directory if it does not exist
            if (! mediaStorageDir.exists()) {
                if (! mediaStorageDir.mkdirs()) {
                    Log.d(TAG, "failed to create directory");
                    return null;
                }
            }

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile;
           if(type == MEDIA_TYPE_VIDEO) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "VID_"+ timeStamp + ".mp4");
            } else {
                return null;
            }

            return Uri.fromFile(mediaFile);
        }

        return null;
    }

Its works for me.

这篇关于安卓android.provider.MediaStore.ACTION_VIDEO_CAPTURE返回null onActivityResult具有承上启下7的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆