行业知识
Android 图片裁剪并批量上传视频图片到阿里云OSS
2026-11-14 23:50:34
来源:互联网转载
���加依赖:
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' implementation 'com.soundcloud.android:android-crop:1.0.1@aar' //裁剪包,高版本调用手机裁剪功能不行,调用这个包 //glide implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' //阿里云oss上传// implementation 'com.aliyun.dpa:oss-android-sdk:+' implementation 'com.aliyun.dpa:oss-android-sdk:2.9.13' implementation 'commons-codec:commons-codec:1.4' //裁剪控件// api 'com.theartofdev.edmodo:android-image-cropper:2.7.0' api 'com.theartofdev.edmodo:android-image-cropper:2.8.+' implementation 'top.zibin:Luban:1.1.8' //RecyclerViewAdapter implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
在清单文件AndroidmMainfest中添加权限:
打开相册前动态请求图库权限:
static final String[] PS={ /*Manifest.permission.READ_CONTACTS,*/ /*Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.RECORD_AUDIO,*/ Manifest.permission.WRITE_EXTERNAL_STORAGE }; boolean checkPermission(){ boolean ok=true; for(String p: PS){ ok=checkCallingOrSelfPermission(p)== PackageManager.PERMISSION_GRANTED; if(!ok) break; } if(!ok) return false; return true; }//判断是否拥有权限:if(!checkPermission()){ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ requestPermissions(PS, PS.hashCode()); } return; } startActivity(new Intent(MainActivity.this, SelectPicActivity.class));
SelectPicActivity:
package com.example.testcsdnproject.picdemo;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.GridLayoutManager;import androidx.recyclerview.widget.RecyclerView;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;import com.example.testcsdnproject.R;import com.luck.picture.lib.PictureSelector;import com.luck.picture.lib.animators.AnimationType;import com.luck.picture.lib.config.PictureConfig;import com.luck.picture.lib.config.PictureMimeType;import com.luck.picture.lib.entity.LocalMedia;import com.luck.picture.lib.language.LanguageConfig;import com.luck.picture.lib.tools.SdkVersionUtils;import java.util.ArrayList;import java.util.List;//选择相册public class SelectPicActivity extends AppCompatActivity { private TextView tv_upload; private RecyclerView rv_dynamic; private GridImageAdapter2 gridImageAdapter2; private List selectList = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_pic); tv_upload = findViewById(R.id.tv_upload); rv_dynamic = findViewById(R.id.rv_dynamic); GridLayoutManager manager = new GridLayoutManager(this,4,RecyclerView.VERTICAL,false); rv_dynamic.setLayoutManager(manager); gridImageAdapter2 = new GridImageAdapter2(this,onAddPicClickListener); rv_dynamic.setAdapter(gridImageAdapter2); tv_upload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (selectList.size() == 0){ Toast.makeText(SelectPicActivity.this, "请上传图片视频。", Toast.LENGTH_SHORT).show(); return; } uploadFile(); } }); //添加点击事件 gridImageAdapter2.setOnItemClickListener(new GridImageAdapter2.OnItemClickListener() { @Override public void onItemClick(View v, int position) { if (selectList.size()>0){ LocalMedia media = selectList.get(position); String pictureType = media.getMimeType(); int mediaType = PictureMimeType.getMimeType(pictureType); switch (mediaType){ case 1 : //预览图片 PictureSelector.create(SelectPicActivity.this).externalPicturePreview(position,selectList,0); break; case 2 : //预览视频 PictureSelector.create(SelectPicActivity.this).externalPictureVideo(media.getPath()); break; case 3 : //预览音频 PictureSelector.create(SelectPicActivity.this).externalPictureAudio(media.getPath()); break; } } } }); } // 从相册返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK){ switch (requestCode){ case PictureConfig.CHOOSE_REQUEST: selectList = PictureSelector.obtainMultipleResult(data); gridImageAdapter2.setList(selectList); gridImageAdapter2.notifyDataSetChanged(); break; } } } //把图片上传OSS private String filePath; private List urls = new ArrayList(); private List urlsCallback = new ArrayList(); private void uploadFile(){ OssService ossService = new OssService(this, 1); ossService.initOSSClient(); urls.clear(); for (int i = 0; i position) { list.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, list.size()); } } catch (Exception e) { e.printStackTrace(); } } public GridImageAdapter2(Context context, onAddPicClickListener mOnAddPicClickListener) { this.mInflater = LayoutInflater.from(context); this.mOnAddPicClickListener = mOnAddPicClickListener; } public GridImageAdapter2(Context context, onAddPicClickListener mOnAddPicClickListener, int selectMax) { this.mInflater = LayoutInflater.from(context); this.mOnAddPicClickListener = mOnAddPicClickListener; this.selectMax = selectMax; } public void setSelectMax(int selectMax) { this.selectMax = selectMax; } public void setList(List list) { this.list = list; } public List getData() { return list == null ? new ArrayList() : list; } public void remove(int position) { if (list != null && position mOnAddPicClickListener.onAddPicClick()); viewHolder.mIvDel.setVisibility(View.INVISIBLE); } else { viewHolder.mIvDel.setVisibility(View.VISIBLE); viewHolder.mIvDel.setOnClickListener(view -> { int index = viewHolder.getAdapterPosition(); // 这里有时会返回-1造成数据下标越界,具体可参考getAdapterPosition()源码, // 通过源码分析应该是bindViewHolder()暂未绘制完成导致,知道原因的也可联系我~感谢 if (index != RecyclerView.NO_POSITION && list.size() > index) { list.remove(index); notifyItemRemoved(index); notifyItemRangeChanged(index, list.size()); } }); LocalMedia media = list.get(position); if (media == null || TextUtils.isEmpty(media.getPath())) { return; } int chooseModel = media.getChooseModel(); String path; if (media.isCut() && !media.isCompressed()) { // 裁剪过 path = media.getCutPath(); } else if (media.isCompressed() || (media.isCut() && media.isCompressed())) { // 压缩过,或者裁剪同时压缩过,以最终压缩过图片为准 path = media.getCompressPath(); } else { // 原图 path = media.getPath(); } Log.i(TAG, "原图地址::" + media.getPath()); if (media.isCut()) { Log.i(TAG, "裁剪地址::" + media.getCutPath()); } if (media.isCompressed()) { Log.i(TAG, "压缩地址::" + media.getCompressPath()); Log.i(TAG, "压缩后文件大小::" + new File(media.getCompressPath()).length() / 1024 + "k"); } if (!TextUtils.isEmpty(media.getAndroidQToPath())) { Log.i(TAG, "Android Q特有地址::" + media.getAndroidQToPath()); } if (media.isOriginal()) { Log.i(TAG, "是否开启原图功能::" + true); Log.i(TAG, "开启原图功能后地址::" + media.getOriginalPath()); } long duration = media.getDuration(); viewHolder.tvDuration.setVisibility(PictureMimeType.isHasVideo(media.getMimeType()) ? View.VISIBLE : View.GONE); if (chooseModel == PictureMimeType.ofAudio()) { viewHolder.tvDuration.setVisibility(View.VISIBLE); viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds (R.drawable.picture_icon_audio, 0, 0, 0); } else { viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds (R.drawable.picture_icon_video, 0, 0, 0); } viewHolder.tvDuration.setText(DateUtils.formatDurationTime(duration)); if (chooseModel == PictureMimeType.ofAudio()) { viewHolder.mImg.setImageResource(R.drawable.picture_audio_placeholder); } else { Glide.with(viewHolder.itemView.getContext()) .load(PictureMimeType.isContent(path) && !media.isCut() && !media.isCompressed() ? Uri.parse(path) : path) .centerCrop() .placeholder(R.color.app_color_f6) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(viewHolder.mImg); } //itemView 的点击事件 if (mItemClickListener != null) { viewHolder.itemView.setOnClickListener(v -> { int adapterPosition = viewHolder.getAdapterPosition(); mItemClickListener.onItemClick(v, adapterPosition); }); } if (mItemLongClickListener != null) { viewHolder.itemView.setOnLongClickListener(v -> { int adapterPosition = viewHolder.getAdapterPosition(); mItemLongClickListener.onItemLongClick(viewHolder, adapterPosition, v); return true; }); } } //设置图片宽高比1:1 ViewGroup.LayoutParams layoutParams = viewHolder.mImg.getLayoutParams();// layoutParams.width = (int) (Common.getScreenWidth(mContext)*0.95); layoutParams.height = (int) (layoutParams.width ); viewHolder.mImg.setLayoutParams(layoutParams); } private OnItemClickListener mItemClickListener; public interface OnItemClickListener { void onItemClick(View v, int position); } public void setOnItemClickListener(OnItemClickListener l) { this.mItemClickListener = l; } private OnItemLongClickListener mItemLongClickListener; public void setItemLongClickListener(OnItemLongClickListener l) { this.mItemLongClickListener = l; }} gv_filter_image.xml:(小图标自己上千图网找)
OnItemLongClickListener:
package com.example.testcsdnproject.picdemo;import android.view.View;import androidx.recyclerview.widget.RecyclerView;/** * @author:luck * @date:2020-01-13 17:58 * @describe:长按事件 */public interface OnItemLongClickListener { void onItemLongClick(RecyclerView.ViewHolder holder, int position, View v);} GlideEngine:(加载引擎)
package com.example.testcsdnproject.picdemo;import android.content.Context;import android.graphics.Bitmap;import android.graphics.PointF;import android.graphics.drawable.Drawable;import android.view.View;import android.widget.ImageView;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.core.graphics.drawable.RoundedBitmapDrawable;import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;import com.bumptech.glide.Glide;import com.bumptech.glide.request.RequestOptions;import com.bumptech.glide.request.target.BitmapImageViewTarget;import com.bumptech.glide.request.target.ImageViewTarget;import com.example.testcsdnproject.R;import com.luck.picture.lib.engine.ImageEngine;import com.luck.picture.lib.listener.OnImageCompleteCallback;import com.luck.picture.lib.tools.MediaUtils;import com.luck.picture.lib.widget.longimage.ImageSource;import com.luck.picture.lib.widget.longimage.ImageViewState;import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView;/** * @author:luck * @date:2019-11-13 17:02 * @describe:Glide加载引擎 */public class GlideEngine implements ImageEngine { /** * 加载图片 * * @param context * @param url * @param imageView */ @Override public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) { Glide.with(context) .load(url) .into(imageView); } /** * 加载网络图片适配长图方案 * # 注意:此方法只有加载网络图片才会回调 * * @param context * @param url * @param imageView * @param longImageView * @param callback 网络图片加载回调监听 {link after version 2.5.1 Please use the #OnImageCompleteCallback#} */ @Override public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, SubsamplingScaleImageView longImageView, OnImageCompleteCallback callback) { Glide.with(context) .asBitmap() .load(url) .into(new ImageViewTarget(imageView) { @Override public void onLoadStarted(@Nullable Drawable placeholder) { super.onLoadStarted(placeholder); if (callback != null) { callback.onShowLoading(); } } @Override public void onLoadFailed(@Nullable Drawable errorDrawable) { super.onLoadFailed(errorDrawable); if (callback != null) { callback.onHideLoading(); } } @Override protected void setResource(@Nullable Bitmap resource) { if (callback != null) { callback.onHideLoading(); } if (resource != null) { boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(), resource.getHeight()); longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE); imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE); if (eqLongImage) { // 加载长图 longImageView.setQuickScaleEnabled(true); longImageView.setZoomEnabled(true); longImageView.setPanEnabled(true); longImageView.setDoubleTapZoomDuration(100); longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP); longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER); longImageView.setImage(ImageSource.bitmap(resource), new ImageViewState(0, new PointF(0, 0), 0)); } else { // 普通图片 imageView.setImageBitmap(resource); } } } }); } /** * 加载网络图片适配长图方案 * # 注意:此方法只有加载网络图片才会回调 * * @param context * @param url * @param imageView * @param longImageView * @ 已废弃 */ @Override public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, SubsamplingScaleImageView longImageView) { Glide.with(context) .asBitmap() .load(url) .into(new ImageViewTarget(imageView) { @Override protected void setResource(@Nullable Bitmap resource) { if (resource != null) { boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(), resource.getHeight()); longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE); imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE); if (eqLongImage) { // 加载长图 longImageView.setQuickScaleEnabled(true); longImageView.setZoomEnabled(true); longImageView.setPanEnabled(true); longImageView.setDoubleTapZoomDuration(100); longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP); longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER); longImageView.setImage(ImageSource.bitmap(resource), new ImageViewState(0, new PointF(0, 0), 0)); } else { // 普通图片 imageView.setImageBitmap(resource); } } } }); } /** * 加载相册目录 * * @param context 上下文 * @param url 图片路径 * @param imageView 承载图片ImageView */ @Override public void loadFolderImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) { Glide.with(context) .asBitmap() .load(url) .override(180, 180) .centerCrop() .sizeMultiplier(0.5f) .apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder)) .into(new BitmapImageViewTarget(imageView) { @Override protected void setResource(Bitmap resource) { RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory. create(context.getResources(), resource); circularBitmapDrawable.setCornerRadius(8); imageView.setImageDrawable(circularBitmapDrawable); } }); } /** * 加载gif * * @param context 上下文 * @param url 图片路径 * @param imageView 承载图片ImageView */ @Override public void loadAsGifImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) { Glide.with(context) .asGif() .load(url) .into(imageView); } /** * 加载图片列表图片 * * @param context 上下文 * @param url 图片路径 * @param imageView 承载图片ImageView */ @Override public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) { Glide.with(context) .load(url) .override(200, 200) .centerCrop() .apply(new RequestOptions().placeholder(R.drawable.picture_image_placeholder)) .into(imageView); } private GlideEngine() { } private static GlideEngine instance; public static GlideEngine createGlideEngine() { if (null == instance) { synchronized (GlideEngine.class) { if (null == instance) { instance = new GlideEngine(); } } } return instance; }} AddArtWorksBean 测试数据的实体类:
package com.example.testcsdnproject.picdemo;import com.google.gson.annotations.SerializedName;import java.io.Serializable;public class AddArtWorksBean implements Serializable { @SerializedName("artId") private Long artId; @SerializedName("artSaleState") private String artSaleState; @SerializedName("audioBand") private String audioBand; @SerializedName("authorName") private String authorName; @SerializedName("authorPortrait") private String authorPortrait; @SerializedName("changeSpeech") private Integer changeSpeech; @SerializedName("copyright") private Long copyright; @SerializedName("copyrightDirectory") private String copyrightDirectory; @SerializedName("cover") private String cover; @SerializedName("creativeProcess") private String creativeProcess; @SerializedName("fodder") private Integer fodder; @SerializedName("gatherId") private Integer gatherId; @SerializedName("gatherSort") private String gatherSort; @SerializedName("gdmoaId") private Integer gdmoaId; @SerializedName("id") private Long id; @SerializedName("imageHeight") private Long imageHeight; @SerializedName("imageWidth") private Long imageWidth; @SerializedName("introduce") private String introduce; @SerializedName("isAuthor") private Integer isAuthor; @SerializedName("isFamous") private String isFamous; @SerializedName("isShare") private Integer isShare; @SerializedName("material") private String material; @SerializedName("name") private String name; @SerializedName("organizationUserid") private Long organizationUserid; @SerializedName("parentDirectory") private String parentDirectory; @SerializedName("publishTime") private String publishTime; @SerializedName("releaseSort") private Integer releaseSort; @SerializedName("releaseTime") private String releaseTime; @SerializedName("secondMaterial") private String secondMaterial; @SerializedName("share") private Integer share; @SerializedName("shareDirectory") private Integer shareDirectory; @SerializedName("speechUrl") private String speechUrl; @SerializedName("state") private Integer state; @SerializedName("type") private Integer type; @SerializedName("url") private String url; @SerializedName("userId") private Long userId; @SerializedName("videoTime") private String videoTime; @SerializedName("viewNumber") private Integer viewNumber; @SerializedName("workGiveLike") private Integer workGiveLike; @SerializedName("workHeight") private Long workHeight; @SerializedName("workTags") private String workTags; @SerializedName("workWidth") private Long workWidth; @SerializedName("workYear") private String workYear; public Long getArtId() { return artId; } public void setArtId(Long artId) { this.artId = artId; } public String getArtSaleState() { return artSaleState; } public void setArtSaleState(String artSaleState) { this.artSaleState = artSaleState; } public String getAudioBand() { return audioBand; } public void setAudioBand(String audioBand) { this.audioBand = audioBand; } public String getAuthorName() { return authorName; } public void setAuthorName(String authorName) { this.authorName = authorName; } public String getAuthorPortrait() { return authorPortrait; } public void setAuthorPortrait(String authorPortrait) { this.authorPortrait = authorPortrait; } public Integer getChangeSpeech() { return changeSpeech; } public void setChangeSpeech(Integer changeSpeech) { this.changeSpeech = changeSpeech; } public Long getCopyright() { return copyright; } public void setCopyright(Long copyright) { this.copyright = copyright; } public String getCopyrightDirectory() { return copyrightDirectory; } public void setCopyrightDirectory(String copyrightDirectory) { this.copyrightDirectory = copyrightDirectory; } public String getCover() { return cover; } public void setCover(String cover) { this.cover = cover; } public String getCreativeProcess() { return creativeProcess; } public void setCreativeProcess(String creativeProcess) { this.creativeProcess = creativeProcess; } public Integer getFodder() { return fodder; } public void setFodder(Integer fodder) { this.fodder = fodder; } public Integer getGatherId() { return gatherId; } public void setGatherId(Integer gatherId) { this.gatherId = gatherId; } public String getGatherSort() { return gatherSort; } public void setGatherSort(String gatherSort) { this.gatherSort = gatherSort; } public Integer getGdmoaId() { return gdmoaId; } public void setGdmoaId(Integer gdmoaId) { this.gdmoaId = gdmoaId; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getImageHeight() { return imageHeight; } public void setImageHeight(Long imageHeight) { this.imageHeight = imageHeight; } public Long getImageWidth() { return imageWidth; } public void setImageWidth(Long imageWidth) { this.imageWidth = imageWidth; } public String getIntroduce() { return introduce; } public void setIntroduce(String introduce) { this.introduce = introduce; } public Integer getIsAuthor() { return isAuthor; } public void setIsAuthor(Integer isAuthor) { this.isAuthor = isAuthor; } public String getIsFamous() { return isFamous; } public void setIsFamous(String isFamous) { this.isFamous = isFamous; } public Integer getIsShare() { return isShare; } public void setIsShare(Integer isShare) { this.isShare = isShare; } public String getMaterial() { return material; } public void setMaterial(String material) { this.material = material; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getOrganizationUserid() { return organizationUserid; } public void setOrganizationUserid(Long organizationUserid) { this.organizationUserid = organizationUserid; } public String getParentDirectory() { return parentDirectory; } public void setParentDirectory(String parentDirectory) { this.parentDirectory = parentDirectory; } public String getPublishTime() { return publishTime; } public void setPublishTime(String publishTime) { this.publishTime = publishTime; } public Integer getReleaseSort() { return releaseSort; } public void setReleaseSort(Integer releaseSort) { this.releaseSort = releaseSort; } public String getReleaseTime() { return releaseTime; } public void setReleaseTime(String releaseTime) { this.releaseTime = releaseTime; } public String getSecondMaterial() { return secondMaterial; } public void setSecondMaterial(String secondMaterial) { this.secondMaterial = secondMaterial; } public Integer getShare() { return share; } public void setShare(Integer share) { this.share = share; } public Integer getShareDirectory() { return shareDirectory; } public void setShareDirectory(Integer shareDirectory) { this.shareDirectory = shareDirectory; } public String getSpeechUrl() { return speechUrl; } public void setSpeechUrl(String speechUrl) { this.speechUrl = speechUrl; } public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getVideoTime() { return videoTime; } public void setVideoTime(String videoTime) { this.videoTime = videoTime; } public Integer getViewNumber() { return viewNumber; } public void setViewNumber(Integer viewNumber) { this.viewNumber = viewNumber; } public Integer getWorkGiveLike() { return workGiveLike; } public void setWorkGiveLike(Integer workGiveLike) { this.workGiveLike = workGiveLike; } public Long getWorkHeight() { return workHeight; } public void setWorkHeight(Long workHeight) { this.workHeight = workHeight; } public String getWorkTags() { return workTags; } public void setWorkTags(String workTags) { this.workTags = workTags; } public Long getWorkWidth() { return workWidth; } public void setWorkWidth(Long workWidth) { this.workWidth = workWidth; } public String getWorkYear() { return workYear; } public void setWorkYear(String workYear) { this.workYear = workYear; }} OssService :(OSS上传服务)
package com.example.testcsdnproject.picdemo;import android.content.Context;import android.net.Uri;import android.text.TextUtils;import android.util.Log;import com.alibaba.sdk.android.oss.ClientConfiguration;import com.alibaba.sdk.android.oss.ClientException;import com.alibaba.sdk.android.oss.OSS;import com.alibaba.sdk.android.oss.OSSClient;import com.alibaba.sdk.android.oss.ServiceException;import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;import com.alibaba.sdk.android.oss.callback.OSSProgressCallback;import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider;import com.alibaba.sdk.android.oss.internal.OSSAsyncTask;import com.alibaba.sdk.android.oss.model.PutObjectRequest;import com.alibaba.sdk.android.oss.model.PutObjectResult;import org.json.JSONException;import org.json.JSONObject;import java.io.File;import java.util.HashMap;import java.util.List;import java.util.Random;public class OssService { private OSS oss; private Context context; private ProgressCallback progressCallback; public final static String endpoint = "http://oss-cn-shenzhen.aliyuncs.com"; public final static String accessKeyId = "自己填参数";// public final static String accessKeySecret = "自己申请参数"; public final static String bucketName = "testCsdn"; public int mType; public OssService(Context context, int type) { this.context = context; this.mType = type; } public void initOSSClient() { //OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider("", "", ""); //这个初始化安全性没有Sts安全,如需要很高安全性建议用OSSStsTokenCredentialProvider创建(上一行创建方式)多出的参数SecurityToken为临时授权参数 final OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret); final ClientConfiguration conf = new ClientConfiguration(); conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒 conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒 conf.setMaxConcurrentRequest(9); // 最大并发请求数,默认5个 conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次 // oss为全局变量,endpoint是一个OSS区域地址 oss = new OSSClient(context, endpoint, credentialProvider, conf); } public void beginupload(final Context context, String filename, String path, String osspath, final String callbackbody, String houzhuiming) { //通过填写文件名形成objectname,通过这个名字指定上传和下载的文件 String objectname = filename; if (objectname == null || objectname.equals("")) {// ToastUtils.sh("文件名不能为空"); return; } //下面3个参数依次为bucket名,Object名,上传文件路径 Log.e("colin: ", callbackbody + "=========" + osspath + objectname + getRandomString() + houzhuiming); PutObjectRequest put = new PutObjectRequest(bucketName, osspath + objectname +getRandomString() + houzhuiming, path); if (path == null || path.equals("")) { return; } put.setCallbackParam(new HashMap() { { put("callbackUrl", "拼接服务器域名"/*AppConstant.OSS_IMAGE_URL*/); put("callbackBody", callbackbody); } }); // 异步上传,可以设置进度回调 put.setProgressCallback(new OSSProgressCallback() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {// LogUtil.d("currentSize: " + currentSize + " totalSize: " + totalSize); double progress = currentSize * 1.0 / totalSize * 100.f; if (progressCallback != null) { progressCallback.onProgressCallback(progress); } } }); @SuppressWarnings("rawtypes") OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.d("colin", "UploadSuccess"); // 只有设置了servercallback,这个值才有数据 String serverCallbackReturnJson = result.getServerCallbackReturnBody(); Log.d("colin", serverCallbackReturnJson); try { JSONObject jsonObject = new JSONObject(serverCallbackReturnJson); String avatar_url = ""; switch (mType) { case 1: avatar_url = jsonObject.optString("avatar_url"); break; case 14: avatar_url = jsonObject.optString("avatar_url"); break; case 3: avatar_url = jsonObject.optString("imageUrl"); break; case 6: avatar_url = jsonObject.optString("artShowCoverUrl"); break; case 9: avatar_url = jsonObject.optString("photoUrl"); break; case 11: avatar_url = jsonObject.optString("videoCoverUrl"); break; case 2: avatar_url = ""; break; } mOnCallbackClickListener.onCallBack(avatar_url,serverCallbackReturnJson); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { // 请求异常// if (clientExcepion != null) { // 本地异常如网络异常等// LogUtil.e("UploadFailure:表示向OSS发送请求或解析来自OSS的响应时发生错误。\n" +// " *例如,当网络不可用时,这个异常将被抛出"); clientExcepion.printStackTrace(); } if (serviceException != null) { // 服务异常// LogUtil.e("UploadFailure:表示在OSS服务端发生错误"); Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); //task.cancel(); // 可以取消任务// task.waitUntilFinished(); // 可以等待直到任务完成 } public ProgressCallback getProgressCallback() { return progressCallback; } public void setProgressCallback(ProgressCallback progressCallback) { this.progressCallback = progressCallback; } public interface ProgressCallback { void onProgressCallback(double progress); } private onCallbackClickListener mOnCallbackClickListener; public interface onCallbackClickListener { void onCallBack(String imageurl,String json); } public void setCallbackClickListener(onCallbackClickListener clickListener) { this.mOnCallbackClickListener = clickListener; } /*---------------------- 分割线 -------------------------*/ private onCallbackVideoClickListener mOnCallbackVideoClickListener; public interface onCallbackVideoClickListener { void onCallBackVideo(String imageurl,String coverUrl,String json); } public void setCallbackVideoClickListener(onCallbackVideoClickListener clickListener) { this.mOnCallbackVideoClickListener = clickListener; } /*---------------------- 分割线 -------------------------*/ /** * 阿里云OSS上传(默认是异步多文件上传) * 布展上传封面 * @param urls */ public void ossUpload(final List urls) { if (urls.size()
上一篇:怎么查服务器占用内存?
下一篇:网站建设该怎么做