Android拍照保存在系统相册不显示的问题解决方法

2016-02-19 09:32 4 1 收藏

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的Android拍照保存在系统相册不显示的问题解决方法,希望大家看完后能赶快学习起来。

【 tulaoshi.com - 编程语言 】

可能大家都知道我们保存相册到Android手机的时候,然后去打开系统图库找不到我们想要的那张图片,那是因为我们插入的图片还没有更新的缘故,先讲解下插入系统图库的方法吧,很简单,一句代码就能实现
代码如下:

MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", "");

通过上面的那句代码就能插入到系统图库,这时候有一个问题,就是我们不能指定插入照片的名字,而是系统给了我们一个当前时间的毫秒数为名字,有一个问题郁闷了很久,我还是先把insertImage的源码贴出来吧 代码如下:

/**
* Insert an image and create a thumbnail for it.
*
* @param cr The content resolver to use
* @param source The stream to use for the image
* @param title The name of the image
* @param description The description of the image
* @return The URL to the newly created image, or codenull/code if the image failed to be stored
* for any reason.
*/
public static final String insertImage(ContentResolver cr, Bitmap source,
String title, String description) {
ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, title);
values.put(Images.Media.DESCRIPTION, description);
values.put(Images.Media.MIME_TYPE, "image/jpeg");
Uri url = null;
String stringUrl = null; /* value to be returned */
try {
url = cr.insert(EXTERNAL_CONTENT_URI, values);
if (source != null) {
OutputStream imageOut = cr.openOutputStream(url);
try {
source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
} finally {
imageOut.close();
}
long id = ContentUris.parseId(url);
// Wait until MINI_KIND thumbnail is generated.
Bitmap miniThumb = Images.Thumbnails.getThumbnail(cr, id,
Images.Thumbnails.MINI_KIND, null);
// This is for backward compatibility.
Bitmap microThumb = StoreThumbnail(cr, miniThumb, id, 50F, 50F,
Images.Thumbnails.MICRO_KIND);
} else {
Log.e(TAG, "Failed to create thumbnail, removing original");
cr.delete(url, null, null);
url = null;
}
} catch (Exception e) {
Log.e(TAG, "Failed to insert image", e);
if (url != null) {
cr.delete(url, null, null);
url = null;
}
}
if (url != null) {
stringUrl = url.toString();
}
return stringUrl;
}

上面方法里面有一个title,我刚以为是可以设置图片的名字,设置一下,原来不是,郁闷,哪位高手知道title这个字段是干嘛的,告诉下小弟,不胜感激!
当然Android还提供了一个插入系统相册的方法,可以指定保存图片的名字,我把源码贴出来吧
代码如下:

/**
* Insert an image and create a thumbnail for it.
*
* @param cr The content resolver to use
* @param imagePath The path to the image to insert
* @param name The name of the image
* @param description The description of the image
* @return The URL to the newly created image
* @throws FileNotFoundException
*/
public static final String insertImage(ContentResolver cr, String imagePath,
String name, String description) throws FileNotFoundException {
// Check if file exists with a FileInputStream
FileInputStream stream = new FileInputStream(imagePath);
try {
Bitmap bm = BitmapFactory.decodeFile(imagePath);
String ret = insertImage(cr, bm, name, description);
bm.recycle();
return ret;
} finally {
try {
stream.close();
} catch (IOException e) {
}
}
}

啊啊,贴完源码我才发现,这个方法调用了第一个方法,这个name就是上面方法的title,晕死,这下更加郁闷了,反正我设置title无效果,求高手为小弟解答,先不管了,我们继续往下说
上面那段代码插入到系统相册之后还需要发条广播
代码如下:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

上面那条广播是扫描整个sd卡的广播,如果你sd卡里面东西很多会扫描很久,在扫描当中我们是不能访问sd卡,所以这样子用户体现很不好,用过微信的朋友都知道,微信保存图片到系统相册并没有扫描整个SD卡,所以我们用到下面的方法
代码如下:

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(new File("/sdcard/image.jpg"));
intent.setData(uri);
mContext.sendBroadcast(intent);

或者用MediaScannerConnection
代码如下:

final MediaScannerConnection msc = new MediaScannerConnection(mContext, new MediaScannerConnectionClient() {
public void onMediaScannerConnected() {
msc.scanFile("/sdcard/image.jpg", "image/jpeg");
}
public void onScanCompleted(String path, Uri uri) {
Log.v(TAG, "scan completed");
msc.disconnect();
}
});

也行你会问我,怎么获取到我们刚刚插入的图片的路径?呵呵,这个自有方法获取,insertImage(ContentResolver cr, Bitmap source,String title, String description),这个方法给我们返回的就是插入图片的Uri,我们根据这个Uri就能获取到图片的绝对路径
代码如下:

private String getFilePathByContentResolver(Context context, Uri uri) {
if (null == uri) {
return null;
}
Cursor c = context.getContentResolver().query(uri, null, null, null, null);
String filePath = null;
if (null == c) {
throw new IllegalArgumentException(
"Query on " + uri + " returns null result.");
}
try {
if ((c.getCount() != 1) || !c.moveToFirst()) {
} else {
filePath = c.getString(
c.getColumnIndexOrThrow(MediaColumns.DATA));
}
} finally {
c.close();
}
return filePath;
}

根据上面的那个方法获取到的就是图片的绝对路径,这样子我们就不用发送扫描整个SD卡的广播了,呵呵,写到这里就算是写完了,写的很乱,希望大家将就的看下,希望对你有帮助!

来源:http://www.tulaoshi.com/n/20160219/1591169.html

延伸阅读
《街头霸王X铁拳》按键设置无法保存问题解决方法 选项-控制器设定-拉到最右:游戏内菜单 这一项都设置就可以保存了 战斗和游戏内菜单的键位是可以重复的 亲测可用。 追加12名新角色的PSV版《街头霸王X铁拳》10月底上市    Capcom日前宣布,PSV版《街头霸王X铁拳》(Street Fighter X Tekken)预定将于10月23日在北美上市、10月2...
《死亡岛激流》爆音问题解决方法 死亡岛:激流爆音问题解决方法 1、应该是只有usb耳机用户才会出现这问题吧,将驱动里的系统音源改为2ch 4ch 6ch都行。8ch会爆音。 2、\DI\Out\Settings audio.scr用文字编辑器打开API("XAudio2")改为API("aOpenAL") 3、7.1太高端了.换回5.1吧。 阅读延伸: 《死亡岛:激流》修改枪支子...
《森林》0.02版常见问题解决方法 《森林》是Endnight Games的恐怖冒险新作,该作品是4人小团队的做的,所以现在存在大量bug。 0.02版发现bug 1存档丢失包里部分物品。 2第一次死亡后在随机刷出来的山洞中有时会立马刷出野人杀掉你,然后Game over。 3部分野人你砍碎他还是有炸飞现象。 4蓝莓目前熟透了为深蓝色,其他颜色千万不能...
标签: 电脑入门
由于QQ所采用的nProtect键盘输入加密控件与最新的Windows Vista操作系统不兼容,因此,Windows Vista系统的用户在使用QQ的时候,可能会产生计算机蓝屏等故障。 蓝屏问题的临时解决方案: 1、请找到QQ的安装目录,方法如下: 在桌面上找到QQ图标,用鼠标右键点击图标,在出现的菜单中,点击“属性” 在弹出的窗口中...
《死亡空间3》延迟乱码问题解决方法 如果发现一直处在瞄准状态,请取消大写锁定。 如果蓝屏,请自行调节画质为自定义或最低。 鼠标有延迟是因为从xbox移植没有去掉鼠标平滑。 汉化提示错误的请重装游戏重打注册表再汉化。 乱码问题查看有无卸载关键字库,死亡空间3汉化字体应该是雅黑,那就重打雅黑字库。 以上两条若尝试无效则等待新版...

经验教程

618

收藏

65
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部