一站式解决,Android 拍照 图库的各种问题.

  在android开发中,
在一些编辑个人信息的时候,经常会有头像这么一个东西,就两个方面,调用系统相机拍照,调用系统图库获取图片.但是往往会遇到各种问题:

1.oom

2.图片方向不对

3.activity result 的时候data == null

4.调用图库的时候没找到软件

嘿嘿..开代码:

首先是调用系统拍照,和图库的代码

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

package
com.chzh.fitter.util;

import java.io.File;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.database.Cursor;

import
android.net.Uri;

import
android.provider.MediaStore;

import
android.widget.Toast;

//在onActivityResult方法中根据requestCode和resultCode来获取当前拍照的图片地址。

//注意:这里有个问题,在有些机型当中(如SamsungI939、note2等)遇见了当拍照并存储之后,intent当中得到的data为空:

/**

 * data = null 的情况主要是由于拍照的时候横屏了,导致重新create, 普通的解决方法可以在sharedpreference里面保存拍照文件的路径(onSaveInstance保存),

 * 在onRestoreSaveInstance里面在获取出来.

 * 最简单的可以用fileUtil 里面的一个静态变量保存起来..

 * */

public
class CameraUtil {

    private
static final String IMAGE_TYPE = "image/*";

    private
Context mContext;

    public
CameraUtil(Context context) {

        mContext = context;

    }

    /**

     * 打开照相机

     * @param activity 当前的activity

     * @param requestCode 拍照成功时activity forResult 的时候的requestCode

     * @param photoFile 拍照完毕时,图片保存的位置

     */

    public
void openCamera(Activity activity, int
requestCode, File photoFile) {

        Intent intent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));

        activity.startActivityForResult(intent, requestCode);

    }

    /**

     * 本地照片调用

     * @param activity

     * @param requestCode

     */

    public
void openPhotos(Activity activity, int
requestCode) {

        if
(openPhotosNormal(activity, requestCode) && openPhotosBrowser(activity, requestCode) && openPhotosFinally());

    }

    /**

     * PopupMenu打开本地相册.

     */

    private
boolean openPhotosNormal(Activity activity, int
actResultCode) {

        Intent intent = new
Intent(Intent.ACTION_PICK, null);

        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

                IMAGE_TYPE);

        try
{

            activity.startActivityForResult(intent, actResultCode);

        } catch
(android.content.ActivityNotFoundException e) {

            return
true;

        }

        return
false;

    }

    /**

     * 打开其他的一文件浏览器,如果没有本地相册的话

     */

    private
boolean openPhotosBrowser(Activity activity, int
requestCode) {

        Toast.makeText(mContext, "没有相册软件,运行文件浏览器", Toast.LENGTH_LONG).show();

        Intent intent = new
Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"

        intent.setType(IMAGE_TYPE); // 查看类型 String IMAGE_UNSPECIFIED =

                                    // "image/*";

        Intent wrapperIntent = Intent.createChooser(intent, null);

        try
{

            activity.startActivityForResult(wrapperIntent, requestCode);

        } catch
(android.content.ActivityNotFoundException e1) {

            return
true;

        }

        return
false;

    }

    /**

     * 这个是找不到相关的图片浏览器,或者相册

     */

    private
boolean openPhotosFinally() {

        Toast.makeText(mContext, "您的系统没有文件浏览器或则相册支持,请安装!", Toast.LENGTH_LONG).show();

        return
false;

    }

    /**

     * 获取从本地图库返回来的时候的URI解析出来的文件路径

     * @return

     */

    public
static String getPhotoPathByLocalUri(Context context, Intent data) {

        Uri selectedImage = data.getData();

        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = context.getContentResolver().query(selectedImage,

                filePathColumn, null, null, null);

        cursor.moveToFirst();

        int
columnIndex = cursor.getColumnIndex(filePathColumn[0]);

        String picturePath = cursor.getString(columnIndex);

        cursor.close();

        return
picturePath;

    }

}

  接下来是解决oom的

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

package
com.chzh.fitter.util;

import java.io.FileDescriptor;

import java.io.FileInputStream;

import java.io.IOException;

import android.graphics.Bitmap;

import android.graphics.Bitmap.Config;

import android.graphics.BitmapFactory;

import
android.graphics.BitmapFactory.Options;

import
android.graphics.Canvas;

import
android.graphics.Matrix;

import
android.graphics.Paint;

import
android.graphics.PorterDuff.Mode;

import
android.graphics.PorterDuffXfermode;

import
android.graphics.Rect;

import
android.graphics.RectF;

import
android.media.ExifInterface;

import
android.net.Uri;

import
android.util.Log;

import
android.widget.ImageView;

import
com.androidquery.util.AQUtility;

/**

 * @author jarrahwu

 *

 */

public
class ImageUtil {

    /**

     * Utility method for downsampling images.

     *

     * @param path

     *            the file path

     * @param data

     *            if file path is null, provide the image data directly

     * @param target

     *            the target dimension

     * @param isWidth

     *            use width as target, otherwise use the higher value of height

     *            or width

     * @param round

     *            corner radius

     * @return the resized image

     */

    public
static Bitmap getResizedImage(String path, byte[] data, int
target,

            boolean
isWidth, int
round) {

        Options options = null;

        if
(target > 0) {

            Options info = new
Options();

            info.inJustDecodeBounds = true;

            //设置这两个属性可以减少内存损耗

            info.inInputShareable = true;

            info.inPurgeable = true;

            decode(path, data, info);

            int
dim = info.outWidth;

            if
(!isWidth)

                dim = Math.max(dim, info.outHeight);

            int
ssize = sampleSize(dim, target);

            options = new
Options();

            options.inSampleSize = ssize;

        }

        Bitmap bm = null;

        try
{

            bm = decode(path, data, options);

        } catch
(OutOfMemoryError e) {

            L.red(e.toString());

            e.printStackTrace();

        }

        if
(round > 0) {

            bm = getRoundedCornerBitmap(bm, round);

        }

        return
bm;

    }

    private
static Bitmap decode(String path, byte[] data,

            BitmapFactory.Options options) {

        Bitmap result = null;

        if
(path != null) {

            result = decodeFile(path, options);

        } else
if (data != null) {

            // AQUtility.debug("decoding byte[]");

            result = BitmapFactory.decodeByteArray(data, 0, data.length,

                    options);

        }

        if
(result == null
&& options != null
&& !options.inJustDecodeBounds) {

            AQUtility.debug("decode image failed", path);

        }

        return
result;

    }

    private
static Bitmap decodeFile(String path, BitmapFactory.Options options) {

        Bitmap result = null;

        if
(options == null) {

            options = new
Options();

        }

        options.inInputShareable = true;

        options.inPurgeable = true;

        FileInputStream fis = null;

        try
{

            fis = new
FileInputStream(path);

            FileDescriptor fd = fis.getFD();

            // AQUtility.debug("decoding file");

            // AQUtility.time("decode file");

            result = BitmapFactory.decodeFileDescriptor(fd, null, options);

            // AQUtility.timeEnd("decode file", 0);

        } catch
(IOException e) {

            AQUtility.report(e);

        } finally
{

            AQUtility.close(fis);

        }

        return
result;

    }

    private
static int sampleSize(int
width, int
target) {

        int
result = 1;

        for
(int i = 0; i < 10; i++) {

            if
(width < target * 2) {

                break;

            }

            width = width / 2;

            result = result * 2;

        }

        return
result;

    }

    /**

     * 获取圆角的bitmap

     * @param bitmap

     * @param pixels

     * @return

     */

    private
static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int
pixels) {

        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),

                bitmap.getHeight(), Config.ARGB_8888);

        Canvas canvas = new
Canvas(output);

        final
int color = 0xff424242;

        final
Paint paint = new
Paint();

        final
Rect rect = new
Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());

        final
RectF rectF = new
RectF(rect);

        final
float roundPx = pixels;

        paint.setAntiAlias(true);

        canvas.drawARGB(0, 0, 0, 0);

        paint.setColor(color);

        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new
PorterDuffXfermode(Mode.SRC_IN));

        canvas.drawBitmap(bitmap, rect, rect, paint);

        return
output;

    }

    /**

     * auto fix the imageOrientation

     * @param bm source

     * @param iv imageView  if set invloke it‘s setImageBitmap() otherwise do nothing

     * @param uri image Uri if null user path

     * @param path image path if null use uri

     */

    public
static Bitmap autoFixOrientation(Bitmap bm, ImageView iv, Uri uri,String path) {

        int
deg = 0;

        try
{

            ExifInterface exif = null;

            if
(uri == null) {

                exif = new
ExifInterface(path);

            }

            else
if (path == null) {

                exif = new
ExifInterface(uri.getPath());

            }

            if
(exif == null) {

                L.red("exif is null check your uri or path");

                return
bm;

            }

            String rotate = exif.getAttribute(ExifInterface.TAG_ORIENTATION);

            int
rotateValue = Integer.parseInt(rotate);

            System.out.println("orientetion : "
+ rotateValue);

            switch
(rotateValue) {

            case
ExifInterface.ORIENTATION_ROTATE_90:

                deg = 90;

                break;

            case
ExifInterface.ORIENTATION_ROTATE_180:

                deg = 180;

                break;

            case
ExifInterface.ORIENTATION_ROTATE_270:

                deg = 270;

                break;

            default:

                deg = 0;

                break;

            }

        } catch
(Exception ee) {

            Log.d("catch img error", "return");

            if(iv != null)

            iv.setImageBitmap(bm);

            return
bm;

        }

        Matrix m = new
Matrix();

        m.preRotate(deg);

        bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true);

        //bm = Compress(bm, 75);

        if(iv != null)

            iv.setImageBitmap(bm);

        return
bm;

    }

}

  这两个东西,是解决这些问题的利器.

  如果想要代码Demo的话,可以留言.有什么坑爹的地方,多多拍砖..over.

时间: 2024-10-10 09:45:22

一站式解决,Android 拍照 图库的各种问题.的相关文章

彻底解决android拍照后无法显示的问题

这是对上篇"android 图片拍照,相册选图,剪切并显示"的文章之后的 改进 上一篇文章虽然能解决图片的拍照剪切以及显示,但是发现他有一个缺点, 如果该程序单独运行,貌似没有任何问题, 但是把它整合到项目中后,发现有时在小米手机或者三星手机上面仍旧会失败, 原因可能是 拍照后导致内存不足,从而拍照后返回的时候,没有返回数据,导致图片显示失败,当然这是一定的概率事件. 针对这一情况做如下改变,代码如下: package com.kuiboo.xiaoyao.Activity; impo

语音识别,语义理解一站式解决(android平台&olami sdk)

用olami sdk语音识别语义理解做在线听书 olamisdk实现了把录音或者文字转化为用户可以理解的json字符串,本文使用olami sdk做了一个在线听书的demo,用的是喜马拉雅的在线听书sdk.基于eclipse开发环境,libs目录下jar和so文件如下: olami-android-sdk.jar//olami sdk 的jar afinal_0.5.1_bin.jar litepal.jar gson-2.2.4.jar okhttp-2.4.0.jar okhttp-urlc

[Android] 拍照、截图、保存并显示在ImageView控件中

最近在做Android的项目,其中部分涉及到图像处理的内容.这里先讲述如何调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法. PS:作者购买了本<Android第一行代码 著:郭霖>,参照里面的内容完成(推荐该书,前面的布局及应用非常不错).网上这类资料非常多,作者仅仅分享给初学者同时在线记录些内容,希望对大家有所帮助. 首先,设置activity_main.xml为LinearLayout布局且 android:orientation=&q

android 拍照注意问题

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, reqCode);//reqCode是返回的code. 但是在有些手机会在protected void onActivityResult(int requestCode, int resultCode, Intent data)里返回的data为空,这时候我们就要想一些办法来解决了,这个是手机问题. 我们要设置系统

Android拍照+方形剪裁——附代码与效果图

本文链接    http://blog.csdn.net/xiaodongrush/article/details/29173567 参考链接    http://stackoverflow.com/questions/12758425/how-to-set-the-output-image-use-com-android-camera-action-crop 1. 缘起 要开发一个头像上传的模块,头像上传过程分两步.第一步,相机拍照或者从图库选取照片,产生一个照片,第二步,提供头像剪裁,一般是

Android 从 Android 本地图库选择多个图片

原文地址 本文说明如何从 Android 本地图库选择多个图片.作者考虑很多解决方案. 演示从 Android 本地图库选择多个图片,有两个方法可以实现从图库中选择多个图片: 用 Intent 获取多个图片 自定义图库从本地获取和加载图片 下载 Demo 下载 Demo 后将 QDReader 图片目录复制到 sd 卡上 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.2(API 19) SAMSUNG GT-8618,Androi

PIGOSS BSM一站式解决十多个所有监控命令的监控功能 (续)

6. vmstat – 虚拟内存统计信息 vmstat是虚拟内存(virtual memory statistics)的缩写,作为一个内存监控工具,它收集和显示关于内存,进程,终端和分页和I/O阻塞的概括信息.作为一个开源程序,它可以在大部分Linux发行版本中找到,包括Solaris和FreeBSD.它用诊断大部分的内存性能问题和其他相关问题. 7.free – 内存统计信息 free是另一个能够在终端中显示内存和交换空间使用的命令行工具.由于它的简易,它经常用于快速查看内存使用或者是应用于不

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题

解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题http://blog.csdn.net/u012336923/article/details/48289485 /路径/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.0.1/res/values-v23/v