刚刚录制的视频/音频无法在某些设备上播放。获得"sorry, video cannot be played",但在图库中播放相同的视频



某些设备无法播放刚刚录制的视频/音频。收到"抱歉,无法播放视频",但在图库中播放了相同的视频。刚刚录制的视频/音频无法在某些设备上播放。收到"抱歉,无法播放视频",但在图库中播放了相同的视频。下面是我的代码

public class CaptureImageActivity extends Activity {
    // Activity request codes
    private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
    private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;
    public static final int MEDIA_TYPE_IMAGE = 1;
    public static final int MEDIA_TYPE_VIDEO = 2;
    // directory name to store captured images and videos
    private static final String IMAGE_DIRECTORY_NAME = "ICS Camera";
    private Uri fileUri; // file url to store image/video
    private ImageView imgPreview;
    private VideoView videoPreview;
    private TextView cancel, send;
    private Intent intent1;
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = new Intent(CaptureImageActivity.this,
                HomeActivity.class);
        HomeActivity.myempid = 1;
        startActivity(intent);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_capture_image);
        imgPreview = (ImageView) findViewById(R.id.imgPreview);
        videoPreview = (VideoView) findViewById(R.id.videoPreview);
        cancel = (TextView) findViewById(R.id.cancel);
        send = (TextView) findViewById(R.id.send);
        int mode = getIntent().getIntExtra(
                ApplicationConstants.IntentKeys.KEY_MODE, 0);
        try {
            if (HomeActivity.camera != null) {
                HomeActivity.camera.release();
                HomeActivity.camera = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (mode == 0)
            captureImage();
        else
            recordVideo();
        /*
         * Capture image button click event
         */
        cancel.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(CaptureImageActivity.this,
                        HomeActivity.class);
                startActivity(intent);
                HomeActivity.myempid = 1;
                CaptureImageActivity.this.finish();
            }
        });
        /*
         * Record video button click event //
         */
        send.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent picMessageIntent = new Intent(
                        android.content.Intent.ACTION_SEND);
                picMessageIntent.setType("image/jpeg");
                File downloadedPic = new File(fileUri.getPath());
                System.out.println("PATH " + fileUri.getPath());
                picMessageIntent.putExtra(Intent.EXTRA_STREAM,
                        Uri.fromFile(downloadedPic));
                startActivity(picMessageIntent);
                // CaptureImageActivity.this.finish();
            }
        });
        // Checking camera availability
        if (!isDeviceSupportCamera()) {
            Toast.makeText(getApplicationContext(),
                    "Sorry! Your device doesn't support camera",
                    Toast.LENGTH_LONG).show();
            // will close the app if the device does't have camera
            finish();
        }
    }
    /**
     * Checking device has camera hardware or not
     * */
    private boolean isDeviceSupportCamera() {
        if (getApplicationContext().getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }
    /*
     * Capturing Camera Image will lauch camera app requrest image capture
     */
    private void captureImage() {
        intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        intent1.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        // start the image capture Intent
        startActivityForResult(intent1, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
    }
    /*
     * Here we store the file url as it will be null after returning from camera
     * app
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // save file url in bundle as it will be null on scren orientation
        // changes
        outState.putParcelable("file_uri", fileUri);
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        // get the file url
        fileUri = savedInstanceState.getParcelable("file_uri");
    }
    /*
     * Recording video
     */
    private void recordVideo() {
        intent1 = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
        // set video quality
        intent1.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        intent1.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image
                                                            // file
                                                            // name
        // start the video capture Intent
        startActivityForResult(intent1, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
    }
    /**
     * Receiving activity result method will be called after closing the camera
     * */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // if the result is capturing Image
        if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                // successfully captured the image
                // display it in image view
                previewCapturedImage();
            } else if (resultCode == RESULT_CANCELED) {
                System.out.println("RESULT CANCELED");
                // user cancelled Image capture
                Toast.makeText(getApplicationContext(),
                        "User cancelled image capture", Toast.LENGTH_SHORT)
                        .show();
                Intent intent = new Intent(CaptureImageActivity.this,
                        HomeActivity.class);
                startActivity(intent);
                HomeActivity.myempid = 1;
                CaptureImageActivity.this.finish();
            } else {
                // failed to capture image
                Toast.makeText(getApplicationContext(),
                        "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                        .show();
            }
        } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                // video successfully recorded
                // preview the recorded video
                // sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                // Uri.parse(fileUri.getPath())));
                System.out.println("RESULT OK");
                previewVideo();
            } else if (resultCode == RESULT_CANCELED) {
                // user cancelled recording
                Intent intent = new Intent(CaptureImageActivity.this,
                        HomeActivity.class);
                startActivity(intent);
                HomeActivity.myempid = 1;
                Toast.makeText(getApplicationContext(),
                        "User cancelled video recording", Toast.LENGTH_SHORT)
                        .show();
                finish();
            } else {
                System.out.println("FAIL");
                // failed to record video
                Toast.makeText(getApplicationContext(),
                        "Sorry! Failed to record video", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }
    /*
     * Display image from a path to ImageView
     */
    private void previewCapturedImage() {
        try {
            // hide video preview
            videoPreview.setVisibility(View.GONE);
            imgPreview.setVisibility(View.VISIBLE);
            // bimatp factory
            BitmapFactory.Options options = new BitmapFactory.Options();
            // downsizing image as it throws OutOfMemory Exception for larger
            // images
            options.inSampleSize = 8;
            final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                    options);
            System.out.println(bitmap);
            imgPreview.setImageBitmap(bitmap);
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
    /*
     * Previewing recorded video
     */
    private void previewVideo() {
        try {
            System.out.println("PATH " + fileUri.getPath());
            getContentResolver().notifyChange(Uri.parse(fileUri.getPath()),
                    null);
            MediaController mc = new MediaController(this);
            mc.setAnchorView(videoPreview);
            // mc.setMediaPlayer(videoPreview);
            // hide image preview
            // videoPreview.setOnPreparedListener(new OnPreparedListener() {
            //
            // public void onPrepared(MediaPlayer mp) {
            // // TODO Auto-generated method stub
            // mp.start();
            // }
            // });
            imgPreview.setVisibility(View.GONE);
            // getWindow().clearFlags(
            // WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
            // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            // WindowManager.LayoutParams.FLAG_FULLSCREEN);
            videoPreview.setVisibility(View.VISIBLE);
            // 02-15 11:51:52.973: I/System.out(17840): PATH
            // /mnt/sdcard/Pictures/ICS Camera/VID_20140215_115133.mp4
            videoPreview.setVideoPath(fileUri.getPath());
            // videoPreview.setVideoURI(Uri.parse(Provoder.CONTENT_URI_BASE
            // + Uri.encode(fileUri.getPath())));
            videoPreview.setMediaController(mc);
            videoPreview.requestFocus();
            videoPreview.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * ------------ Helper Methods ----------------------
     * */
    /*
     * Creating file uri to store image/video
     */
    public Uri getOutputMediaFileUri(int type) {
        return Uri.fromFile(getOutputMediaFile(type));
    }
    /*
     * returning image / video
     */
    private static File getOutputMediaFile(int type) {
        // External sdcard location
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                IMAGE_DIRECTORY_NAME);
        // Create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                        + IMAGE_DIRECTORY_NAME + " directory");
                return null;
            }
        }
        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                Locale.getDefault()).format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator
                    + "IMG_" + timeStamp + ".jpg");
        } else if (type == MEDIA_TYPE_VIDEO) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator
                    + "VID_" + timeStamp + ".mp4");
        } else {
            return null;
        }
        return mediaFile;
    }

}
使用以下

代码解决了我的问题

import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
import com.kubical.ES.R;
import com.kubical.ES.util.ApplicationConstants;
public class CaptureImageActivity extends Activity {
    // Activity request codes
    private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
    private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;
    public static final int MEDIA_TYPE_IMAGE = 1;
    public static final int MEDIA_TYPE_VIDEO = 2;
    // directory name to store captured images and videos

    private ImageView imgPreview;
    private VideoView videoPreview;
    private TextView cancel, send;
    private Intent intent1;
    private String filePath;
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = new Intent(CaptureImageActivity.this,
                HomeActivity.class);
        HomeActivity.myempid = 1;
        startActivity(intent);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_capture_image);
        imgPreview = (ImageView) findViewById(R.id.imgPreview);
        videoPreview = (VideoView) findViewById(R.id.videoPreview);
        cancel = (TextView) findViewById(R.id.cancel);
        send = (TextView) findViewById(R.id.send);
        int mode = getIntent().getIntExtra(
                ApplicationConstants.IntentKeys.KEY_MODE, 0);
        try {
            if (HomeActivity.camera != null) {
                HomeActivity.camera.release();
                HomeActivity.camera = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (mode == 0)
            captureImage();
        else
            recordVideo();
        /*
         * Capture image button click event
         */
        cancel.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(CaptureImageActivity.this,
                        HomeActivity.class);
                startActivity(intent);
                HomeActivity.myempid = 1;
                CaptureImageActivity.this.finish();
            }
        });
        /*
         * Record video button click event //
         */
        send.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent picMessageIntent = new Intent(
                        android.content.Intent.ACTION_SEND);
                picMessageIntent.setType("image/jpeg");
                File downloadedPic = new File(filePath);
                System.out.println("PATH " + filePath);
                picMessageIntent.putExtra(Intent.EXTRA_STREAM,
                        Uri.fromFile(downloadedPic));
                startActivity(picMessageIntent);
                // CaptureImageActivity.this.finish();
            }
        });
        // Checking camera availability
        if (!isDeviceSupportCamera()) {
            Toast.makeText(getApplicationContext(),
                    "Sorry! Your device doesn't support camera",
                    Toast.LENGTH_LONG).show();
            // will close the app if the device does't have camera
            finish();
        }
    }
    /**
     * Checking device has camera hardware or not
     * */
    private boolean isDeviceSupportCamera() {
        if (getApplicationContext().getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }
    /*
     * Capturing Camera Image will lauch camera app requrest image capture
     */
    private void captureImage() {
        intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent1, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
    }

    /*
     * Recording video
     */
    private void recordVideo() {
        intent1 = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        startActivityForResult(intent1, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
    }
    /**
     * Receiving activity result method will be called after closing the camera
     * */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // if the result is capturing Image
        if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                previewCapturedImage(data);
            } else if (resultCode == RESULT_CANCELED) {
                System.out.println("RESULT CANCELED");
                // user cancelled Image capture
                Toast.makeText(getApplicationContext(),
                        "User cancelled image capture", Toast.LENGTH_SHORT)
                        .show();
                Intent intent = new Intent(CaptureImageActivity.this,
                        HomeActivity.class);
                startActivity(intent);
                HomeActivity.myempid = 1;
                CaptureImageActivity.this.finish();
            } else {
                // failed to capture image
                Toast.makeText(getApplicationContext(),
                        "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                        .show();
            }
        } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                previewVideo(data);
            } else if (resultCode == RESULT_CANCELED) {
                // user cancelled recording
                Intent intent = new Intent(CaptureImageActivity.this,
                        HomeActivity.class);
                startActivity(intent);
                HomeActivity.myempid = 1;
                Toast.makeText(getApplicationContext(),
                        "User cancelled video recording", Toast.LENGTH_SHORT)
                        .show();
                finish();
            } else {
                System.out.println("FAIL");
                // failed to record video
                Toast.makeText(getApplicationContext(),
                        "Sorry! Failed to record video", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }
    /*
     * Display image from a path to ImageView
     */
    private void previewCapturedImage(Intent data) {
        try {
            // hide video preview
            videoPreview.setVisibility(View.GONE);
            imgPreview.setVisibility(View.VISIBLE);
            // bimatp factory
            BitmapFactory.Options options = new BitmapFactory.Options();
            // downsizing image as it throws OutOfMemory Exception for larger
            // images
            options.inSampleSize = 8;
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            filePath = cursor.getString(columnIndex);
            System.out.println("PATH IS " + filePath);
            cursor.close();
            final Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
            System.out.println(bitmap);
            imgPreview.setImageBitmap(bitmap);
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
    /*
     * Previewing recorded video
     */
    private void previewVideo(Intent data) {
        try {
            Uri contentUri = data.getData();
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(contentUri, proj, null,
                    null, null);
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            filePath = cursor.getString(column_index);
            MediaController mc = new MediaController(this);
            mc.setAnchorView(videoPreview);
            imgPreview.setVisibility(View.GONE);
            videoPreview.setVisibility(View.VISIBLE);
            videoPreview.setVideoPath(filePath);
            videoPreview.setMediaController(mc);
            videoPreview.requestFocus();
            videoPreview.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

最新更新