android4.4从系统图库无法加载图片的问题

典型的使用场景就是要设置一个头像,头像需要从系统图库或者拍照获得,在android4.4之前,我用的代码没问题,但是今天使用android4.4的时候突然发现不灵了。baidu了一圈,终于解决了。

下面是解决方案:

Java代码

1.privateString[] items =newString[] {"图库","拍照"};

2./*头像名称*/

3.privatestaticfinalString IMAGE_FILE_NAME ="face.jpg";

4./*请求码*/

5.privatestaticfinalintIMAGE_REQUEST_CODE =0;

6.privatestaticfinalintSELECT_PIC_KITKAT =3;

7.privatestaticfinalintCAMERA_REQUEST_CODE =1;

8.privatestaticfinalintRESULT_REQUEST_CODE =2;

9.

10.privatevoidshowSettingFaceDialog() {

11.

12.newAlertDialog.Builder(this)

13..setTitle("图片来源")

14..setCancelable(true)

15..setItems(items,newDialogInterface.OnClickListener() {

16.

17.@Override

18.publicvoidonClick(DialogInterface dialog,intwhich) {

19.switch(which) {

20.case0:// Local Image

21.Intent intent=newIntent(Intent.ACTION_GET_CONTENT);

22.intent.addCategory(Intent.CATEGORY_OPENABLE);

23.intent.setType("image/*");

24.if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {

25.startActivityForResult(intent,SELECT_PIC_KITKAT);

26.}else{

27.startActivityForResult(intent,IMAGE_REQUEST_CODE);

28.}

29.break;

30.case1:// Take Picture

31.Intent intentFromCapture =newIntent(

32.MediaStore.ACTION_IMAGE_CAPTURE);

33.//判断存储卡是否可以用,可用进行存储

34.if(hasSdcard()) {

35.intentFromCapture.putExtra(

36.MediaStore.EXTRA_OUTPUT,

37.Uri.fromFile(newFile(Environment

38..getExternalStorageDirectory(),

39.IMAGE_FILE_NAME)));

40.}

41.startActivityForResult(intentFromCapture,

42.CAMERA_REQUEST_CODE);

43.break;

44.}

45.}

46.})

47..setNegativeButton("取消",

48.newDialogInterface.OnClickListener() {

49.

50.@Override

51.publicvoidonClick(DialogInterface dialog,

52.intwhich) {

53.dialog.dismiss();

54.}

55.}).show();

56.

57.}

58.

59.@Override

60.protectedvoidonActivityResult(intrequestCode,intresultCode, Intent data) {

61.//结果码不等于取消时候

62.if(resultCode != RESULT_CANCELED) {

63.switch(requestCode) {

64.caseIMAGE_REQUEST_CODE:

65.startPhotoZoom(data.getData());

66.break;

67.caseSELECT_PIC_KITKAT:

68.startPhotoZoom(data.getData());

69.break;

70.caseCAMERA_REQUEST_CODE:

71.if(hasSdcard()) {

72.File tempFile =newFile(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);

73.startPhotoZoom(Uri.fromFile(tempFile));

74.}else{

75.ToastUtils.showShort(context,"未找到存储卡,无法存储照片!");

76.}

77.

78.break;

79.caseRESULT_REQUEST_CODE:

80.if(data !=null) {

81.setImageToView(data,iv_face);

82.}

83.break;

84.}

85.}

86.super.onActivityResult(requestCode, resultCode, data);

87.}

88.

89./**

90.*裁剪图片方法实现

91.*

92.*@paramuri

93.*/

94.publicvoidstartPhotoZoom(Uri uri) {

95.if(uri ==null) {

96.Log.i("tag","The uri is not exist.");

97.return;

98.}

99.

100.Intent intent =newIntent("com.android.camera.action.CROP");

101.if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {

102.String url=getPath(context,uri);

103.intent.setDataAndType(Uri.fromFile(newFile(url)),"image/*");

104.}else{

105.intent.setDataAndType(uri,"image/*");

106.}

107.

108.//设置裁剪

109.intent.putExtra("crop","true");

110.// aspectX aspectY是宽高的比例

111.intent.putExtra("aspectX",1);

112.intent.putExtra("aspectY",1);

113.// outputX outputY是裁剪图片宽高

114.intent.putExtra("outputX",200);

115.intent.putExtra("outputY",200);

116.intent.putExtra("return-data",true);

117.startActivityForResult(intent, RESULT_REQUEST_CODE);

118.}

119.

120./**

121.*保存裁剪之后的图片数据

122.*

123.*@parampicdata

124.*/

125.privatevoidsetImageToView(Intent data,ImageView imageView) {

126.Bundle extras = data.getExtras();

127.if(extras !=null) {

128.Bitmap photo = extras.getParcelable("data");

129.Bitmap roundBitmap=ImageUtil.toRoundBitmap(photo);

130.imageView.setImageBitmap(roundBitmap);

131.saveBitmap(photo);

132.}

133.}

134.

135.publicvoidsaveBitmap(Bitmap mBitmap) {

136.File f =newFile(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);

137.try{

138.f.createNewFile();

139.FileOutputStream fOut =null;

140.fOut =newFileOutputStream(f);

141.mBitmap.compress(Bitmap.CompressFormat.JPEG,100, fOut);

142.fOut.flush();

143.fOut.close();

144.}catch(FileNotFoundException e) {

145.e.printStackTrace();

146.}catch(IOException e) {

147.e.printStackTrace();

148.}

149.}

150.

151.

152.//以下是关键,原本uri返回的是file:///...来着的,android4.4返回的是content:///...

153.@SuppressLint("NewApi")

154.publicstaticString getPath(finalContext context,finalUri uri) {

155.

156.finalbooleanisKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

157.

158.// DocumentProvider

159.if(isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

160.// ExternalStorageProvider

161.if(isExternalStorageDocument(uri)) {

162.finalString docId = DocumentsContract.getDocumentId(uri);

163.finalString[] split = docId.split(":");

164.finalString type = split[0];

165.

166.if("primary".equalsIgnoreCase(type)) {

167.returnEnvironment.getExternalStorageDirectory() +"/"+ split[1];

168.}

169.

170.}

171.// DownloadsProvider

172.elseif(isDownloadsDocument(uri)) {

173.finalString id = DocumentsContract.getDocumentId(uri);

174.finalUri contentUri = ContentUris.withAppendedId(

175.Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

176.

177.returngetDataColumn(context, contentUri,null,null);

178.}

179.// MediaProvider

180.elseif(isMediaDocument(uri)) {

181.finalString docId = DocumentsContract.getDocumentId(uri);

182.finalString[] split = docId.split(":");

183.finalString type = split[0];

184.

185.Uri contentUri =null;

186.if("image".equals(type)) {

187.contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

188.}elseif("video".equals(type)) {

189.contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

190.}elseif("audio".equals(type)) {

191.contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

192.}

193.

194.finalString selection ="_id=?";

195.finalString[] selectionArgs =newString[] {

196.split[1]

197.};

198.

199.returngetDataColumn(context, contentUri, selection, selectionArgs);

200.}

201.}

202.// MediaStore (and general)

203.elseif("content".equalsIgnoreCase(uri.getScheme())) {

204.// Return the remote address

205.if(isGooglePhotosUri(uri))

206.returnuri.getLastPathSegment();

207.

208.returngetDataColumn(context, uri,null,null);

209.}

210.// File

211.elseif("file".equalsIgnoreCase(uri.getScheme())) {

212.returnuri.getPath();

213.}

214.

215.returnnull;

216.}

217.

218./**

219.* Get the value of the data column for this Uri. This is useful for

220.* MediaStore Uris, and other file-based ContentProviders.

221.*

222.* @param context The context.

223.* @param uri The Uri to query.

224.* @param selection (Optional) Filter used in the query.

225.* @param selectionArgs (Optional) Selection arguments used in the query.

226.* @return The value of the _data column, which is typically a file path.

227.*/

228.publicstaticString getDataColumn(Context context, Uri uri, String selection,

229.String[] selectionArgs) {

230.

231.Cursor cursor =null;

232.finalString column ="_data";

233.finalString[] projection = {

234.column

235.};

236.

237.try{

238.cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,

239.null);

240.if(cursor !=null&& cursor.moveToFirst()) {

241.finalintindex = cursor.getColumnIndexOrThrow(column);

242.returncursor.getString(index);

243.}

244.}finally{

245.if(cursor !=null)

246.cursor.close();

247.}

248.returnnull;

249.}

250.

251.

252./**

253.* @param uri The Uri to check.

254.* @return Whether the Uri authority is ExternalStorageProvider.

255.*/

256.publicstaticbooleanisExternalStorageDocument(Uri uri) {

257.return"com.android.externalstorage.documents".equals(uri.getAuthority());

258.}

259.

260./**

261.* @param uri The Uri to check.

262.* @return Whether the Uri authority is DownloadsProvider.

263.*/

264.publicstaticbooleanisDownloadsDocument(Uri uri) {

265.return"com.android.providers.downloads.documents".equals(uri.getAuthority());

266.}

267.

268./**

269.* @param uri The Uri to check.

270.* @return Whether the Uri authority is MediaProvider.

271.*/

272.publicstaticbooleanisMediaDocument(Uri uri) {

273.return"com.android.providers.media.documents".equals(uri.getAuthority());

274.}

275.

276./**

277.* @param uri The Uri to check.

278.* @return Whether the Uri authority is Google Photos.

279.*/

280.publicstaticbooleanisGooglePhotosUri(Uri uri) {

281.return"com.google.android.apps.photos.content".equals(uri.getAuthority());

282.}

最后只需要在需要的地方调用showSettingFaceDialog()就可以了。

如果要获得剪裁的图片保存路径,然后上传,我这边是这样处理的(这里每个人的写法不一样):

但只要获得filePath就可以根据自己的需求处理了

Java代码

1.privatevoiduploadFace(){

2.File file =newFile(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);

3.String filePath=file.getAbsolutePath();

4.

5.Log.i("tag","filePath="+filePath);

6.HttpHelper.uploadFileWithConcatUrl(context,HttpHelper.UPDATE_USER_ICON,App.user.getUser_session_key() ,filePath ,newHttpHelper.OnFileUploadListener(){

7.

8.@Override

9.publicvoidonFileUploadSuccess(String orignUrl, String midImgUrl,

10.String smallImgUrl) {

11.// TODO Auto-generated method stub

12.

13.App.user.setHead_icon(orignUrl);

14.

15.saveUser();

16.}

17.

18.});

19.}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容