Android分享图片失败解决方案

前言:在做图片分享到微博或是用彩信分享的时候,会遇到“无法将图片添加到信息中”,其实这个问题的原因是创建的那个图片默认是,只能被当前应用调用,无法被其他应用调用,即分享的时候,无法读取到图片,并提示IO错误,所以解决方案就是创建文件的时候,赋予这个文件读写权限,即可以被其他应用读写。
代码如下:
1.保存图片到内存中:data/data/应用包名/files/文件
/**
* 将图片存放在公开的文件中,用于其他应用读取
*
* @param in
* 数据流
* @param name
* 文件的名字
* @param context
* 上下文
*/
public static void copyPrivateRawResourceToPubliclyAccessibleFile(
InputStream in, String name, Context context) {
FileOutputStream outputStream = null;
try {
// openFileOutput是android提供的一个方法,参数1:文件的名字包含扩展名(名字中不能包含/),参数2:创建文件所有的权限
outputStream = ((Activity) context).openFileOutput(name,
Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
byte[] buffer = new byte[1024];
int length = 0;
try {
while ((length = in.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
} catch (IOException ioe) {
/* ignore */
}
} catch (FileNotFoundException fnfe) {
/* ignore */
} finally {
try {
in.close();
} catch (IOException ioe) {
/* ignore */
}
try {
outputStream.close();
} catch (IOException ioe) {
/* ignore */
}
} }
2.访问保存的图片
// 创建分享跳转,向其中加入分享图片的地址,这个地址不是SD卡中的
// getFileStreamPath()方法是android提供的,通过name获得刚刚存储的文件绝对路径,并加入分享中。
mBase_intent = new Intent(Intent.ACTION_SEND);
mBase_intent.setType("image/*");
mBase_intent.putExtra(Intent.EXTRA_STREAM,
Uri.fromFile(getFileStreamPath(mName)));
provide.setShareIntent(mBase_intent);
3.上面的代码就决解了分享时,图片不能获取的问题,因为文件名字一直是一个,所以应用生成的图片始终是一个,不用担心浪费内存。
下面讲解怎么将图片放入SD卡中。
这个工具类,会判断是否有SD卡,有的话就优先SD卡中建立保存图片的文件夹,若是没有SD卡,就在内存建立:
/**
* 保存图片到本地
*
* @param is
* 图片的is流
* @param imageUri
* 图片的网络地址
* @param context
* @param filename
* 文件的名称
*/
public static HashMap<String, Object> saveBitmap_From_Is(InputStream is,
String imageUri, Context context, String filename,
final Handler handler) {
final HashMap<String, Object> map = new HashMap<String, Object>();
File cache = getCache(imageUri, context, filename);
if (cache == null) {
return null;
}
FileOutputStream os = null;
try {
os = new FileOutputStream(cache);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);
os.close();
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 通知系统增加了一个图片,有的手机不能刷新,导致相册中不能及时显示图片。
MediaScannerConnection.scanFile(context,
new String[] { cache.getAbsolutePath() }, null,
new MediaScannerConnection.OnScanCompletedListener() { @Override
public void onScanCompleted(String path, Uri uri) {
Message age = new Message();
Bundle bundle = new Bundle();
bundle.putString("uri", uri.toString());
bundle.putString("path", path);
age.setData(bundle);
handler.sendMessage(age);
Show_Log("通知系统增加了一个图片URI" + uri.toString());
Show_Log("通知系统增加了一个图片PATH" + path);
}
});
map.put("path", cache.getAbsolutePath());
map.put("file", cache.getAbsoluteFile());
return map;
}
建立缓存文件夹的工具类:
/**
* 创建文件的缓存文件路径,判断是否有SD卡,有就在其中建立,没有就在内存中建立。 这个文件夹是直接在SD/filename形式的。
*
* @param imageUri
* 图片的网络路径,一般/后边就是图片的名字,也可以直接写图片的名字,需要加上.png
* @param context
* 上下文,用于创建文件夹
* @param filename
* 文件夹的名字,SD卡中的文件的名字使用了系统提供的Environment.DIRECTORY_PICTURES,而
* 内存中的文件的名字使用了filename,其实随意就可以。
* @return
*/
public static File getCache(String imageUri, Context context,
String filename) {
String imagename = imageUri.substring(imageUri.lastIndexOf("/") + 1);
File cache = null;
if (Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) {
File file = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
if (file.exists()) {
file.mkdirs();
}
cache = new File(file, imagename);
Show_Log("建立SD卡缓存=" + cache);
} else {
if (context.getFileStreamPath(filename).exists()) {
context.getFileStreamPath(filename).mkdirs();
}
cache = new File(context.getFileStreamPath(filename), imagename);
Show_Log("建立内存卡缓存=" + cache);
}
if (cache.exists()) {
Toast.makeText(context, "文件已保存", Toast.LENGTH_LONG).show();
return null;
}
return cache;
}
Android分享图片失败解决方案的更多相关文章
- 修复 XE8 for Android 分享图片到 Gmail 权限不足的问题
问题:打开 XE8 的 ShareSheet 示例,发布到 Android 实机,按 Share 选 Gmail 结果显示:没有权限添加附件. 适用:XE8 for Android 修复方法: 请将源 ...
- Android微信分享图片大于32k进行压缩
微信分享视频的时候,需要传一个图片数组,大小不能大于32k. 解决方案:使用Bitmap自带的compress方法解决了这个问题. 源码如下: <span style="font-si ...
- Android大图片裁剪终极解决方案(上:原理分析)
转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正 ...
- 微信朋友圈如何同时分享(图片+文字) Android版
以下是:微信朋友圈SDK 分享图片的代码,但只能分享图片,不能分享文字,如何才能图片和文字同时分享?求各位大神指教! public class MainActivity extends Activit ...
- Android实现分享图片和文字的功能
为了应用的推广,我们经常看到点击分享按钮会出现,比如微博微信等应用的分享二等列表,这是如何实现的呢?这一篇将要详细的介绍. android的实现分享是通过隐式的启动activity. 分享文本 1.a ...
- Android - 分享内容 - 接收其他APP的内容
就象程序可以发送数据给其他程序,所以也可以接收其他程序的数据.想一下用户如何和程序交互,以及想从其他程序接收什么样类型的数据.例如,一个社交程序可能对接收其他程序的文字(比如有趣的网址)感兴趣.Goo ...
- 利用WCF与Android实现图片上传并传参
利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...
- Android压缩图片到100K以下并保持不失真的高效方法
前言:目前一般手机的相机都能达到800万像素,像我的Galaxy Nexus才500万像素,拍摄的照片也有1.5M左右.这么大的照片上传到服务器,不仅浪费流量,同时还浪费时间. 在开发Android企 ...
- Android 实现图片画画板
本文主要讲述了Android 实现图片画画板 设计项目布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...
随机推荐
- 在Ubuntu Server 中安装图形用户界面
使用ubuntu server安装lamp主机非常的方便,只要在安装系统的步骤中选择就是了 .但是很多时候我需要在图形界面下管理主机更加方便.今天的教程就是教大家安装图形界面. 首先你需要确定你的源文 ...
- 为何Redis要比Memcached好用
Redis是新兴的通用存储系统,而Memcached仍有其适用领域 Memcached还是Redis? 在现代高性能Web应用中这一直是个争论不休的话题. 在基于关系型数据库的Web应用需要提高性能时 ...
- 遨游maxthon打开页面一片黑色,百度地图等黑屏解决办法
遨游maxthon使用webkit极速核心,打开百度地图等页面一片黑色,黑屏了. 找了好久,不知道什么问题. 版本一样,都是4.4.xxx版本.另外一台机器又正常. 后来上傲游社区,好多人也有这个问题 ...
- SSO单点登录系列5:cas单点登录增加验证码功能完整步骤
本篇教程cas-server端下载地址:解压后,直接放到tomcat的webapp目录下就能用了,不过你需要登录的话,要修改数据源,C:\tomcat7\webapps\casServer\WEB-I ...
- 当php懈垢windows通用上传缺陷
转自独自等待博客 早上逛乌云发现了PKAV大牛的一篇文章,针对php和windows文件上传的分析,思路很YD,果断转之与大家分享. 虽然此文可能有许多的限制条件,但是如果你认真阅读会发现,其实还是比 ...
- Oracle基础(二) 创建数据库实例
Oracle中数据库也称为数据库实例,在Oracle在安装过程中可以选择创建数据库,也可以再安装之后再进行创建. 一般创建数据库可以使用图形界面方式和SQL指令的方式,由于SQL指令方式较为复杂,这里 ...
- java8 lambda 与 stream
参见:https://www.bilibili.com/video/av14372754/?p=2
- apue学习笔记(第一章UNIX基础知识)
总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时 ...
- 微信java开发之实现微信主动推送消息
1.拉取access_token2.拉取用户信息3.主动推送消息4.接口貌似要申请权限5.依赖httpclient4.2.3 和jackson 2.2.1 public class WeixinAPI ...
- windows超过最大连接数解决命令
query user /server:218.57.146.175 logoff 1 /server:218.57.146.175