android开发之用阿里云OSS加载图片

概要

阿里云对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务。用户可以通过调用API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过用户Web控制台对数据进行简单的管理。OSS适合存放任意文件类型,适合各种网站、开发企业及开发者使用。
当然,如果您找到了这篇文章相信您已经知道是什么了,那么废话少说,这里提出一些关于Android开发的小经验,帮助您快速入门

问题目录

从这里开始

首先我们要进行开发,一定是要开发者文档的 ~ 若您还没有注册OSS服务则请在您的阿里云账号上找到如下位置注册即可
android开发之用阿里云OSS加载图片_第1张图片
注册了之后您要了解如下信息,以便我们代码的编写
1、点击进入bucket时您的bucket名称
2、进入Bucket概览里找到您的外网域名
3、进入Object管理里面查看并修改您的文件目录

4、在这里获得AccessKeys(因为假如您给bucket设置了读写权限的话AccessKey就相当于一个通行证,可以在您的程序里自由读写访问bucket)

代码编写

如果以上任务都完成了的话~就让我们开始吧
因为OSS我们并不熟悉,而我们往往会很急着用,所以……

android开发之用阿里云OSS加载图片_第2张图片

拿来用!!

这里贴出资源路径:
http://download.csdn.net/detail/baidu_25537855/9517304

免费的,随便下=w=

代码下载下来相信您已经明白了一大半
这里详细解释一下各个参数:
 // 运行sample前需要配置以下字段为有效的值
    private static final String endpoint = "oss-cn-city.aliyuncs.com"; //这个是外网域名的后半部分(外网域名 = bucket.endpoint)
    private static final String accessKeyId = "这个不能让你们看你们也能找到";
    private static final String accessKeySecret = "这个也是";
    private static final String uploadFilePath = Environment.getExternalStorageDirectory().getPath()+"/test/testByLyfsForOSS.txt"; //这个路径是你要上传的文件的路径(本地)

    private static final String testBucket = "这个就是bucket"; 
    private static final String uploadObject = "images/TestByLyfsForOSS2.txt"; //这个是你要上传到OSS的文件路径,加入想上传到文件夹则前面加上****/****形式的路径即可
    private static final String downloadObject = "images/TestByLyfsForOSS.txt"; // 同理,从OSS上下载的路径

当把这个各参数配置好配置对了之后相信就可以运行试试咯,你会发现文件已经成功传输和下载

用OSS下载图片


将文件目录下的
作为外部模块导入你的相关工程,再把测试文件里除了MainActivity的其他文件导入进来粘贴到你的工程里如图
android开发之用阿里云OSS加载图片_第3张图片
然后就可以在你想要调用的Activity里调用相关的方法了!!

但是怎么进行图片的上传下载呢?这里仅以下载为例进行分析,如有上传有困难的请评论或者私信

这里我们稍微修改了一下OSS提供的内部代码来达成我们的目的

 public byte[] asyncGetObjectSample() {


        GetObjectRequest get = new GetObjectRequest(testBucket, testObject);

        OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback() {
            @Override
            public void onSuccess(GetObjectRequest request, GetObjectResult result) {
                // 请求成功
                InputStream inputStream = result.getObjectContent();

                byte[] buffer = new byte[2048];
                ByteArrayOutputStream outStream = new ByteArrayOutputStream();

                int len;

                try {
                    while ((len = inputStream.read(buffer)) != -1) {
                        // 处理下载的数据
                        outStream.write(buffer, 0, len);
                        Log.d("asyncGetObjectSample", "read length: " + len);
                    }
                    outStream.flush();
                    imageByteArray = outStream.toByteArray();
                    outStream.close();

                    Log.d("asyncGetObjectSample", "download success.");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                // 请求异常
                if (clientExcepion != null) {
                    // 本地异常如网络异常等
                    clientExcepion.printStackTrace();
                }
                if (serviceException != null) {
                    // 服务异常
                    Log.e("ErrorCode", serviceException.getErrorCode());
                    Log.e("RequestId", serviceException.getRequestId());
                    Log.e("HostId", serviceException.getHostId());
                    Log.e("RawMessage", serviceException.getRawMessage());
                }
            }
        });
        while (imageByteArray == null)
        {

        }
        return imageByteArray;
    }

原API给的方法是在这个方法里进行一个异步任务来完成下载,我们只要把获得的字节流拼装之后转换成相应的文件即可,但是我们要在程序里用,所以这里用了一个蹩脚的方法:循环判定直到我们想要的字节流不再为空则返回

这里比较重要的代码单独贴出来

 ByteArrayOutputStream outStream = new ByteArrayOutputStream();

                int len;

                try {
                    while ((len = inputStream.read(buffer)) != -1) {
                        // 处理下载的数据
                        outStream.write(buffer, 0, len);
                        Log.d("asyncGetObjectSample", "read length: " + len);
                    }
                    outStream.flush();
                    imageByteArray = outStream.toByteArray();
                    outStream.close();

这样就可以在
imageByteArray 
里获得最终下载完成的字节数组并进行相关的处理了

new Thread(new Runnable() {
                @Override
                public void run() {
                    imgv_header_pic = BitmapUtils.getPicFromBytes(new GetObjectSamples(NetWorkUtils.oss, Data.testBucket, Data.downloadObject).asyncGetObjectSample(),null);
                    handler.sendEmptyMessage(HANDLER_BANNER_PIC);
                }
            }).start();

我们通过
BitmapUtils.getPicFromByte()
方法将字节数组转换成图片,这个方法的代码为
public static Bitmap getPicFromBytes(byte[] bytes,BitmapFactory.Options opts)
    {
        Log.e("lyfsInBitmap","begin");
        if (bytes != null) {
            if (opts != null) {
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);
            } else {
                Log.e("lyfsInBitmap", bytes.toString());
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            }
        }else {
            Log.e("lyfsInBitmap","bad");
        }
           return null;
    }
如果没有刚才我们运用的那个蹩脚的while循环的话这里传来的字节数组将为空

这样我们就将图片成功的加载下来了,可喜可贺!!

最后调用你的handler进行界面处理就好了

有相关OSS的问题欢迎讨论~程序猿要对自己好一点,愿你在程序的世界里呼风唤雨,成为一个大侠=w=好吧,我承认程序员的修真小说看多了,大家早点休息,晚安~


你可能感兴趣的:(计算机网络,android方面)