相机、相册相关

本文主要介绍了在Android中如何进行相机和相册的整合,包括主类调用相机的逻辑,权限管理,以及使用CameraManager和CameraUtil工具类进行相机操作。同时提到了FileUtil文件工具类在全局初始化文件路径中的应用。
摘要由CSDN通过智能技术生成

主类调用:

ackage com.example.xxx.mycamera;


import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;


import java.io.File;
import java.io.IOException;
import java.util.List;


import me.nereo.multi_image_selector.MultiImageSelectorActivity;
import me.nereo.multi_image_selector.MultiImageSelectorFragment;
import me.nereo.multi_image_selector.utils.FileUtils;


public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void album(View v) {
        CameraManager.getInstance().showAlbumAction(MainActivity.this, false, 1, CameraManager.MODE_SINGLE);
    }


    public void camera(View v) {
        CameraManager.getInstance().showCameraAction(MainActivity.this);
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {


        if (requestCode == CameraManager.REQUEST_CAMERA) {
            //请求拍照
            if (resultCode == Activity.RESULT_OK) {
                if (CameraManager.mTmpFile != null) {
                    Uri o = Uri.fromFile(CameraManager.mTmpFile);
                    CameraManager.mNewPhotoUri = CameraUtil.getOutputMediaFileUri(this, CameraUtil.MEDIA_TYPE_IMAGE);
                    CameraManager.getInstance().cropImage(this, o, CameraManager.mNewPhotoUri, CameraManager.REQUEST_CODE_CROP_PHOTO);


                    Log.d("TAG", "相机 mlocitionFileUrl:" + CameraManager.mNewPhotoUri);
                }
            } else {
                while (CameraManager.mTmpFile != null && CameraManager.mTmpFile.exists()) {
                    boolean success = CameraManager.mTmpFile.delete();
                    if (success) {
                        CameraManager.mTmpFile = null;
                    }
                }
            }
        } else if (requestCode == CameraManager.REQUEST_IMAGE) {
            //请求图片
            if (resultCode == Activity.RESULT_OK) {
                // 获取返回的图片列表
                List<String> path = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
                Uri o = Uri.fromFile(new File(path.get(0)));
                CameraManager.mNewPhotoUri = CameraUtil.getOutputMediaFileUri(this, CameraUtil.MEDIA_TYPE_IMAGE);
                CameraManager.getInstance().cropImage(this, o, CameraManager.mNewPhotoUri, CameraManager.REQUEST_CODE_CROP_PHOTO);
            }


        } else if (requestCode == CameraManager.REQUEST_CODE_CROP_PHOTO) {
            //裁剪
            if (resultCode == Activity.RESULT_OK) {
                if (CameraManager.mNewPhotoUri != null) {
                    CameraManager.mCurrentFile = new File(CameraManager.mNewPhotoUri.getPath());
                    CameraManager.mlocitionFileUrl = CameraManager.mNewPhotoUri.toString();


                    Log.d("TAG", "mlocitionFileUrl:" + CameraManager.mlocitionFileUrl);
                } else {


                }
            }
        }


    }




}

 

权限:

<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--请求访问使用照相设备·使用多选相册中的照相机,这里不要写这个权限,莫名闪出-->
<!--<uses-permission android:name="android.permission.CAMERA" />-->

CameraManager 抽离的相机逻辑类,让主类更集中处理业务逻辑:

package com.example.xxx.mycamera;


import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.widget.Toast;


import java.io.File;
import java.io.IOException;


import me.nereo.multi_image_selector.MultiImageSelectorActivity;
import me.nereo.multi_image_selector.utils.FileUtils;


/**
 * 创建时间:2017/2/14
 * 编写者:
 * 功能描述:相机、相册管理类
 */


public class CameraManager {


    public static File mTmpFile;
    // 请求加载系统照相机
    public static final int REQUEST_CAMERA = 100;


    /**
     * 系统照相机
     * @param activity
     */
    public void showCameraAction(Activity activity) {
        // 跳转到系统照相机
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (cameraIntent.resolveActivity(activity.getPackageManager()) != null) {
            // 设置系统相机拍照后的输出路径
            // 创建临时文件
            try {
                mTmpFile = FileUtils.createTmpFile(activity);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (mTmpFile != null && mTmpFile.exists()) {
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
                // 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1
                //cameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
                activity.startActivityForResult(cameraIntent, REQUEST_CAMERA);
            } else {
                Toast.makeText(activity, "图片错误", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(activity, me.nereo.multi_image_selector.R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
        }
    }
    public void showCameraAction(Fragment fragment) {
        // 跳转到系统照相机
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (cameraIntent.resolveActivity(fragment.getContext().getPackageManager()) != null) {
            // 设置系统相机拍照后的输出路径
            // 创建临时文件
            try {
                mTmpFile = FileUtils.createTmpFile(fragment.getContext());
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (mTmpFile != null && mTmpFile.exists()) {
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
                // 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1
                //cameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
                fragment.startActivityForResult(cameraIntent, REQUEST_CAMERA);
            } else {
                Toast.makeText(fragment.getContext(), "图片错误", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(fragment.getContext(), me.nereo.multi_image_selector.R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
        }
    }


    public static Uri mNewPhotoUri;
    //存储本地头像地址
    public static String mlocitionFileUrl;
    public static File mCurrentFile;


    //图库选择回调
    public static final int REQUEST_IMAGE = 11;
    //裁剪图片
    public static final int REQUEST_CODE_CROP_PHOTO = 12;
    //裁剪照片==图片输出大小
    public static final int PHOTO_OUTPUT_X = 600;
    public static final int PHOTO_OUTPUT_Y = 600;


    public static final int MODE_SINGLE = MultiImageSelectorActivity.MODE_SINGLE;//单选
    public static final int MODE_MULTI = MultiImageSelectorActivity.MODE_MULTI;//多选


    /**
     * 三方相册库(封装了系统相册)
     * @param activity
     */
    public void showAlbumAction(Activity activity, boolean isShowCamera, int maxCount, int mode) {
        Intent intent = new Intent(activity, MultiImageSelectorActivity.class);
        // 是否显示调用相机拍照
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, isShowCamera);
        // 最大图片选择数量
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxCount);
        // 设置模式 (支持 单选/MultiImageSelectorActivity.MODE_SINGLE 或者 多选/MultiImageSelectorActivity.MODE_MULTI)
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, mode);
        // 默认选择图片,回填选项(支持String ArrayList)
        //  intent.putStringArrayListExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, defaultDataArray);
        activity.startActivityForResult(intent, REQUEST_IMAGE);
    }


    public void showAlbumAction(Fragment fragment, boolean isShowCamera, int maxCount, int mode) {
        Intent intent = new Intent(fragment.getContext(), MultiImageSelectorActivity.class);
        // 是否显示调用相机拍照
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, isShowCamera);
        // 最大图片选择数量
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxCount);
        // 设置模式 (支持 单选/MultiImageSelectorActivity.MODE_SINGLE 或者 多选/MultiImageSelectorActivity.MODE_MULTI)
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, mode);
        // 默认选择图片,回填选项(支持String ArrayList)
        //  intent.putStringArrayListExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, defaultDataArray);
        fragment.startActivityForResult(intent, REQUEST_IMAGE);
    }


    private boolean isFreeCut = false;
    public static int aspectX = 1;
    public static int aspectY = 1;
    public static int outputX = 600;
    public static int outputY = 600;
    /**
     * 调用系统裁减功能,裁减某张指定的图片,并输出到指定的位置
     *
     * @param
     * @param originalFileUri 原始图片位置
     * @param outputFileUri   裁减后图片的输出位置,两个地址最好不一样。如果一样的话,有的手机上面无法保存裁减的结果
     * @return
     */
    public void cropImage(Activity activity, Uri originalFileUri, Uri outputFileUri, int requestCode) {
        if (originalFileUri == null) {
            return;
        }
        final Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(originalFileUri, "image/*");
        intent.putExtra("crop", "true");
        if (!isFreeCut) {
            //默认长宽等比裁剪
            intent.putExtra("aspectX", aspectX);
            intent.putExtra("aspectY", aspectY);
            // 裁剪后输出图片的尺寸大小
            if(outputX != 0){
                intent.putExtra("outputX", outputX);
                intent.putExtra("outputY", outputY);
            }
        }
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true); // 部分机型没有设置该参数截图会有黑边
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        // 不启用人脸识别
        intent.putExtra("noFaceDetection", false);
        activity.startActivityForResult(intent, requestCode);
    }
    public void cropImage(Fragment fragment, Uri originalFileUri, Uri outputFileUri, int requestCode) {
        if (originalFileUri == null) {
            return;
        }
        final Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(originalFileUri, "image/*");
        intent.putExtra("crop", "true");
        if (!isFreeCut) {
            //默认长宽等比裁剪
            intent.putExtra("aspectX", aspectX);
            intent.putExtra("aspectY", aspectY);
            // 裁剪后输出图片的尺寸大小
            if(outputX != 0){
                intent.putExtra("outputX", outputX);
                intent.putExtra("outputY", outputY);
            }
        }
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true); // 部分机型没有设置该参数截图会有黑边
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        // 不启用人脸识别
        intent.putExtra("noFaceDetection", false);
        fragment.startActivityForResult(intent, requestCode);
    }


    /**
     * 设置是否剪辑和是否自由剪辑
     * @param isFreeCut 是否自由剪辑(不限定宽高)
     */
    public void setIsFreeCut(boolean isFreeCut) {
        this.isFreeCut = isFreeCut;
    }


    /**获取完整的图片*/
//    private void getPic() {
//        Intent intent = new Intent(Intent.ACTION_PICK);
//        intent.putExtra("return-data", true);
//        intent.setType("image/*"); // 说明你想获得图片
//        startActivityForResult(intent, PHONTO);
//    }


    private static CameraManager cameraManager;
    private CameraManager(){
    }
    //唯一实例入口
    public static CameraManager getInstance(){
        if(null == cameraManager){
            synchronized (CameraManager.class){
                if(null == cameraManager) {
                    cameraManager = new CameraManager();
                }
            }
        }
        return cameraManager;
    }
}

 

CameraUtil 相机工具类(只调用其中部分方法)

package com.example.xxx.mycamera;


import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.text.TextUtils;


import java.io.File;


public final class CameraUtil {
    public static final int MEDIA_TYPE_IMAGE = 1;
    public static final int MEDIA_TYPE_VIDEO = 2;


    /**
     * Create a file Uri for saving an image or video
     *
     * @param context
     * @param type    the type of the file you want saved {@link #MEDIA_TYPE_IMAGE}
     *                {@link #MEDIA_TYPE_VIDEO}
     * @return return the uri of the file ,if create failed,return null
     */
    public static Uri getOutputMediaFileUri(Context context, int type) {
        File file = getOutputMediaFile(context, type);
        if (file == null) {
            return null;
        }
        return Uri.fromFile(file);
    }


    /**
     * Create a file for saving an image or video,is default in the
     * ../Pictures/[you app PackageName] directory
     *
     * @param context
     * @param type    the type of the file you want saved {@link #MEDIA_TYPE_IMAGE}
     *                {@link #MEDIA_TYPE_VIDEO}
     * @return return the file you create,if create failed,return null
     */
    private static File getOutputMediaFile(Context context, int type) {
        String filePath = null;
        if (type == MEDIA_TYPE_IMAGE) {
            filePath = FileUtil.getRandomImageFilePath();
        } else if (type == MEDIA_TYPE_VIDEO) {
            //filePath = FileUtil.getRandomVideoFilePath();
        } else {
            return null;
        }
        if (TextUtils.isEmpty(filePath)) {
            return null;
        } else {
            return new File(filePath);
        }
    }


    /**
     * invoke the system Camera app and capture a image。 you can received the
     * capture result in {@link Activity.onActivityResult(int,int,Intent)}。 If
     * successed,you can use the outputUri to get the image
     *
     * @param activity
     * @param outputUri   拍照后图片的存储路径
     * @param requestCode
     */
    public static void captureImage(Activity activity, Uri outputUri, int requestCode) {
        final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
        activity.startActivityForResult(intent, requestCode);
    }


    /**
     * 调用系统裁减功能,裁减某张指定的图片,并输出到指定的位置
     *
     * @param activity
     * @param originalFileUri 原始图片位置
     * @param outputFileUri   裁减后图片的输出位置,两个地址最好不一样。如果一样的话,有的手机上面无法保存裁减的结果
     * @return
     */
    public static void cropImage(Activity activity, Uri originalFileUri, Uri outputFileUri, int requestCode, int aspectX, int aspectY, int outputX,
                                 int outputY) {
        if (originalFileUri == null) {
            return;
        }
        final Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(originalFileUri, "image/*");
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);


        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true); // 部分机型没有设置该参数截图会有黑边
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        // 不启用人脸识别
        intent.putExtra("noFaceDetection", false);
        activity.startActivityForResult(intent, requestCode);
    }


    /**
     * 调用系统图库选择照片 使用 {@link getImagePathFromUri}方法从
     * onActivityResult的data.getData()中解析获得的Uri
     *
     * @param activity
     * @param requestCode
     * @return
     */
    public static void pickImageSimple(Activity activity, int requestCode) {
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        activity.startActivityForResult(intent, requestCode);
    }


    /**
     * 获得The data stream for the file
     */
    public static String getImagePathFromUri(Context context, Uri uri) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (DocumentsContract.isDocumentUri(context, uri)) {
                return getImagePathFromUriKitkat(context, uri);
            }
        }




        return getImagePathFromUriSimple(context, uri);
    }


    /**
     * 4.4以下
     *
     * @param context
     * @param uri
     */
    private static String getImagePathFromUriSimple(Context context, Uri uri) {
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);


        String path = null;
        try {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);


            if (cursor.moveToFirst()) {
                path = cursor.getString(column_index);
            }


        } catch (Exception e) {


        }
        if (cursor!=null){
            cursor.close();
        }


        return path;


    }


    /**
     * 4.4以上的Document Uri
     *
     * @param context
     * @param uri
     * @return
     */
    private static String getImagePathFromUriKitkat(Context context, Uri uri) {
        String wholeID = DocumentsContract.getDocumentId(uri);
        if (TextUtils.isEmpty(wholeID) || !wholeID.contains(":")) {
            return null;
        }
        // 获得资源唯一ID
        String id = wholeID.split(":")[1];
        // 定义索引字段
        String[] column = {MediaStore.Images.Media.DATA};
        String sel = MediaStore.Images.Media._ID + "=?";


        Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{id}, null);
        int columnIndex = cursor.getColumnIndex(column[0]);


        String filePath = null;
        if (cursor.moveToFirst()) {
            // DATA字段就是本地资源的全路径
            filePath = cursor.getString(columnIndex);
        }
        // 切记要关闭游标
        cursor.close();
        return filePath;
    }


    /**
     * 调用系统图库选择照片,裁减后返回
     * ,4.4上无法确定用户是否是在图库里选择的照片,所以不使用该方法,使用pickImageSimple,返回后在调用裁减
     *
     * @param activity
     * @param filePath    拍照后图片的存储路径
     * @param requestCode
     * @return
     */
    @Deprecated
    public static void pickImageCrop(Activity activity, Uri outputUri, int requestCode, int aspectX, int aspectY, int outputX, int outputY) {
        // Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        Intent intent = new Intent();
        // 根据版本号不同使用不同的Action
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            intent.setAction(Intent.ACTION_GET_CONTENT);
        } else {
            intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
        }


        intent.setType("image/*");
        intent.putExtra("crop", "true");
        // 裁剪框比例
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        // 图片输出大小
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);
        intent.putExtra("scale", true);
        intent.putExtra("scaleUpIfNeeded", true); // 部分机型没有设置该参数截图会有黑边
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);


        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        // 不启用人脸识别
        intent.putExtra("noFaceDetection", false);
        activity.startActivityForResult(intent, requestCode);
    }


    public static interface ScannerResult {
        void onResult(boolean success);
    }


    /**
     * 扫描某张指定的图片放入系统媒体库
     */
    public static void scannerImage(Activity activity, final Uri fileUri, final ScannerResult scannerResult) {
        if (fileUri == null) {
            if (scannerResult != null) {
                scannerResult.onResult(false);
            }
            return;
        }
        sMediaScannerConnection = new MediaScannerConnection(activity, new MediaScannerConnectionClient() {
            public void onMediaScannerConnected() {
                sMediaScannerConnection.scanFile(fileUri.getPath(), "image/*");
            }


            public void onScanCompleted(String path, Uri uri) {
                sMediaScannerConnection.disconnect();
                if (scannerResult != null) {
                    scannerResult.onResult(uri != null);
                }
            }
        });
        sMediaScannerConnection.connect();
    }


    private static MediaScannerConnection sMediaScannerConnection;


    /**
     * 查询某张图片有没有被扫描到媒体库
     *
     * @param activity
     * @param filePath
     * @return 返回这个图片在媒体库的Uri,如果没有扫描到媒体库,则返回null
     */
    public static Uri isImageFileInMedia(Context context, String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            return null;
        }
        Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null,
                MediaStore.Images.Media.DISPLAY_NAME + "='" + file.getName() + "'", null, null);
        Uri uri = null;
        if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToLast();
            long id = cursor.getLong(0);
            uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
        }
        return uri;
    }


}

 

FileUtil 文件工具类:

package com.example.xxx.mycamera;


import android.graphics.Bitmap;
import android.os.Environment;
import android.util.Log;




import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;


public class FileUtil {


	private static final int TYPE_IMAGE = 1;
	private static final int TYPE_ADUIO = 2;
	private static final int TYPE_VIDEO = 3;


	/**
	 * {@link #TYPE_IMAGE}<br/>
	 * {@link #TYPE_ADUIO}<br/>
	 * {@link #TYPE_VIDEO} <br/>
	 * 
	 * @param type
	 * @return
	 */
	private static String getPublicFilePath(int type) {
		String fileDir = null;
		String fileSuffix = null;
		switch (type) {
		case TYPE_ADUIO:
			fileDir = MyApplication.getInstance().mVoicesDir;
			fileSuffix = ".mp3";
			break;
		case TYPE_VIDEO:
			fileDir = MyApplication.getInstance().mVideosDir;
			fileSuffix = ".mp4";
			break;
		case TYPE_IMAGE:
			fileDir = MyApplication.getInstance().mPicturesDir;
			fileSuffix = ".jpg";
			break;
		}
		if (fileDir == null) {
			return null;
		}
		File file = new File(fileDir);
		if (!file.exists()) {
			if (!file.mkdirs()) {
				return null;
			}
		}
		return fileDir + File.separator + UUID.randomUUID().toString().replaceAll("-", "") + fileSuffix;
	}


	/**
	 * {@link #TYPE_ADUIO}<br/>
	 * {@link #TYPE_VIDEO} <br/>
	 * 
	 * @param type
	 * @return
	 */
	private static String getPrivateFilePath(int type, String userId) {
		String fileDir = null;
		String fileSuffix = null;
		switch (type) {
		case TYPE_ADUIO:
			fileDir = MyApplication.getInstance().mAppDir + File.separator + userId + File.separator + Environment.DIRECTORY_MUSIC;
			fileSuffix = ".mp3";
			break;
		case TYPE_VIDEO:
			fileDir = MyApplication.getInstance().mAppDir + File.separator + userId + File.separator + Environment.DIRECTORY_MOVIES;
			fileSuffix = ".mp4";
			break;
		}
		if (fileDir == null) {
			return null;
		}
		File file = new File(fileDir);
		if (!file.exists()) {
			if (!file.mkdirs()) {
				return null;
			}
		}
		return fileDir + File.separator + UUID.randomUUID().toString().replaceAll("-", "") + fileSuffix;
	}


	public static String getRandomImageFilePath() {
		return getPublicFilePath(TYPE_IMAGE);
	}


//	public static String getRandomAudioFilePath() {
//		User user = MyApplication.getInstance().mLoginUser;
//		if (user != null && !TextUtils.isEmpty(user.getUserId())) {
//			return getPrivateFilePath(TYPE_ADUIO, user.getUserId());
//		} else {
//			return getPublicFilePath(TYPE_ADUIO);
//		}
//	}


//	public static String getRandomAudioAmrFilePath() {
//		User user = MyApplication.getInstance().mLoginUser;
//		String filePath = null;
//		if (user != null && !TextUtils.isEmpty(user.getUserId())) {
//			filePath = getPrivateFilePath(TYPE_ADUIO, user.getUserId());
//		} else {
//			filePath = getPublicFilePath(TYPE_ADUIO);
//		}
//		if (!TextUtils.isEmpty(filePath)) {
//			return filePath.replace(".mp3", ".amr");
//		} else {
//			return null;
//		}
//	}


//	public static String getRandomVideoFilePath() {
//		User user = MyApplication.getInstance().mLoginUser;
//		if (user != null && !TextUtils.isEmpty(user.getUserId())) {
//			return getPrivateFilePath(TYPE_VIDEO, user.getUserId());
//		} else {
//			return getPublicFilePath(TYPE_VIDEO);
//		}
//	}






	/**
	 * 根据图片名称把bitmap保存到本地
	 *
	 * @param bm
	 * @param savePath
	 * @param picName
	 * @throws IOException
	 */
	public static void saveBitmapToPath(Bitmap bm, String savePath, String picName) throws IOException {
		Log.e("", "保存图片");
		if (bm == null){
			return;
		}


		File file = new File(savePath);
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
			if (!file.exists() || !file.isDirectory()) {
				file.mkdir();
			}
			String suffixStr = null;
			if (picName.length() >= 4 && picName.lastIndexOf('.') != -1) {
				suffixStr = picName.substring(picName.lastIndexOf('.'));
				if (!".jpg".equals(suffixStr))
					suffixStr = null;
			}


			File f = new File(savePath, picName + (suffixStr == null ? ".jpg" : ""));
			if (f.exists()) {
				f.delete();
			}
			FileOutputStream out = new FileOutputStream(f);
			bm.compress(Bitmap.CompressFormat.JPEG, 90, out);
			out.flush();
			out.close();
			Log.e("", "已经保存");
		}
	}


	// ///


	public static void createFileDir(String fileDir) {
		File fd = new File(fileDir);
		if (!fd.exists()) {
			fd.mkdirs();
		}
	}


	/**
	 * 
	 * @param fullName
	 */
	public static void delFile(String fullName) {
		File file = new File(fullName);
		if (file.exists()) {
			if (file.isFile()) {
				try {
					file.delete();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}


	/**
	 * 删除文件夹里面的所有文件
	 * 
	 * @param path
	 *            String 文件夹路径 如 /sdcard/data/
	 */
	public static void delAllFile(String path) {
		File file = new File(path);
		if (!file.exists()) {
			return;
		}
		if (!file.isDirectory()) {
			return;
		}
		String[] tempList = file.list();
		File temp = null;
		for (int i = 0; i < tempList.length; i++) {
			System.out.println(path + tempList[i]);
			if (path.endsWith(File.separator)) {
				temp = new File(path + tempList[i]);
			} else {
				temp = new File(path + File.separator + tempList[i]);
			}
			if (temp.isFile()) {
				temp.delete();
			}
			if (temp.isDirectory()) {
				delAllFile(path + "/" + tempList[i]); // 先删除文件夹里面的文件
				delFolder(path + "/" + tempList[i]); // 再删除空文件夹
			}
		}
	}


	/**
	 * 删除文件夹
	 * 
	 *            String 文件夹路径及名称 如/sdcard/data/
	 *            String
	 * @return boolean
	 */
	public static void delFolder(String folderPath) {
		try {
			delAllFile(folderPath); // 删除完里面所有内容
			String filePath = folderPath;
			filePath = filePath.toString();
			File myFilePath = new File(filePath);
			myFilePath.delete(); // 删除空文件夹
		} catch (Exception e) {
			System.out.println("删除文件夹操作出错");
			e.printStackTrace();
		}
	}


	/*
	* 输入流转字符串
	*
	* */
	public static String inputStream2String(InputStream is)  throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		int i=-1;
		while((i = is.read() ) != -1){
			baos.write(i);
		}
		return baos.toString();
	}




}

全局初始化文件路径:

package com.example.xxx.mycamera;


import android.app.Application;
import android.content.Context;
import android.os.Environment;


import java.io.File;


/**
 * Created by hermithermit on 16/3/3.
 */
public class MyApplication extends Application {


    private static MyApplication mInstance;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        initAppDir();
    }


    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);


    }


    public static MyApplication getInstance(){
        return mInstance;
    }




    /* 文件缓存的目录 */
    public String mAppDir;
    public String mPicturesDir;
    public String mVoicesDir;
    public String mVideosDir;
    public String mFilesDir;


    private void initAppDir() {
        try {
            File file = getExternalFilesDir(null);
            if (!file.exists()) {
                file.mkdirs();
            }
            mAppDir = file.getAbsolutePath();


            file = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
            if (!file.exists()) {
                file.mkdirs();
            }
            mPicturesDir = file.getAbsolutePath();


            file = getExternalFilesDir(Environment.DIRECTORY_MUSIC);
            if (!file.exists()) {
                file.mkdirs();
            }
            mVoicesDir = file.getAbsolutePath();


            file = getExternalFilesDir(Environment.DIRECTORY_MOVIES);
            if (!file.exists()) {
                file.mkdirs();
            }
            mVideosDir = file.getAbsolutePath();


            file = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
            if (!file.exists()) {
                file.mkdirs();
            }
            mFilesDir = file.getAbsolutePath();
        }catch (Exception e){


        }


    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值