android 上傳圖片到阿里雲oss
阿新 • • 發佈:2018-12-09
1.引入包
//引入阿里雲oss包 implementation 'com.aliyun.dpa:oss-android-sdk:+' implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.squareup.okio:okio:1.9.0' implementation 'com.android.support:multidex:1.0.3' implementation 'com.youth.banner:banner:1.4.10'
2.寫入開啟相機許可權和寫入SD卡的許可權,網路許可權
<!-- 往SDCard寫入資料許可權 --> <uses-permission android:name="android.permission. WRITE_EXTERNAL_STORAGE" /> <!--請求訪問使用照相裝置--> <uses-permission android:name="android.permission.CAMERA" />
3.寫入開啟相機的程式碼
private static final int CODE_GALLERY_REQUEST = 0xa0; private static final int CODE_CAMERA_REQUEST = 0xa1; private static final int CODE_RESULT_REQUEST = 0xa2; private static final int CAMERA_PERMISSIONS_REQUEST_CODE = 0x03; private static final int STORAGE_PERMISSIONS_REQUEST_CODE = 0x04; private File fileUri = new File(Environment.getExternalStorageDirectory().getPath() + "/photo.jpg"); private File fileCropUri = new File(Environment.getExternalStorageDirectory().getPath() + "/crop_photo.jpg"); private Uri imageUri; private Uri cropImageUri; /** * 自動獲取相機許可權 */ private void autoObtainCameraPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { ToastUtils.shortToast( "您已經拒絕過一次"); } ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_PERMISSIONS_REQUEST_CODE); } else {//有許可權直接呼叫系統相機拍照 if (hasSdcard()) { imageUri = Uri.fromFile(fileUri); //通過FileProvider建立一個content型別的Uri if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { imageUri = FileProvider.getUriForFile(SettingActivity.this, "com.zz.fileprovider", fileUri); } PhotoUtils.takePicture(this, imageUri, CODE_CAMERA_REQUEST); } else { ToastUtils.shortToast( "裝置沒有SD卡!"); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { //呼叫系統相機申請拍照許可權回撥 case CAMERA_PERMISSIONS_REQUEST_CODE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (hasSdcard()) { imageUri = Uri.fromFile(fileUri); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) imageUri = FileProvider.getUriForFile(SettingActivity.this, "com.zz.fileprovider", fileUri);//通過FileProvider建立一個content型別的Uri PhotoUtils.takePicture(this, imageUri, CODE_CAMERA_REQUEST); } else { ToastUtils.shortToast( "裝置沒有SD卡!"); } } else { ToastUtils.shortToast( "請允許開啟相機!!"); } break; } //呼叫系統相簿申請Sdcard許可權回撥 case STORAGE_PERMISSIONS_REQUEST_CODE: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { PhotoUtils.openPic(this, CODE_GALLERY_REQUEST); } else { ToastUtils.shortToast( "請允許打操作SDCard!!"); } break; default: } } private static final int OUTPUT_X = 1000; private static final int OUTPUT_Y = 1000; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { //拍照完成回撥 case CODE_CAMERA_REQUEST: cropImageUri = Uri.fromFile(fileCropUri); Log.e("顯示",cropImageUri+""); PhotoUtils.cropImageUri(this, imageUri, cropImageUri, 1000, 1000, OUTPUT_X, OUTPUT_Y, CODE_RESULT_REQUEST); break; //訪問相簿完成回撥 case CODE_GALLERY_REQUEST: if (hasSdcard()) { cropImageUri = Uri.fromFile(fileCropUri); Uri newUri = Uri.parse(PhotoUtils.getPath(this, data.getData())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { newUri = FileProvider.getUriForFile(this, "com.zz.fileprovider", new File(newUri.getPath())); } PhotoUtils.cropImageUri(this, newUri, cropImageUri, 1, 1, OUTPUT_X, OUTPUT_Y, CODE_RESULT_REQUEST); } else { ToastUtils.shortToast( "裝置沒有SD卡!"); } break; case CODE_RESULT_REQUEST: Bitmap bitmap = PhotoUtils.getBitmapFromUri(cropImageUri, this); if (bitmap != null) { beginupload(cropImageUri); showImages(bitmap); } break; default: } } } /** * 自動獲取sdk許可權 */ private void autoObtainStoragePermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSIONS_REQUEST_CODE); } else { PhotoUtils.openPic(this, CODE_GALLERY_REQUEST); } } private void showImages(Bitmap bitmap) { cir_headimg.setImageBitmap(bitmap); } /** * 檢查裝置是否存在SDCard的工具方法 */ public static boolean hasSdcard() { String state = Environment.getExternalStorageState(); return state.equals(Environment.MEDIA_MOUNTED); }
4.上傳圖片到阿里雲oss,使用下面方法必須繼承的是activity類
public void beginupload(Uri bitmap) { Log.e("圖片地址",bitmap+""); final String endpoint = "oss地址"; final String startpoint = "倉庫名字"; // 明文設定secret的方式建議只在測試時使用,更多鑑權模式請參考後面的`訪問控制`章節 OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider("keyid", "keysecret"); OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); //通過填寫檔名形成objectname,通過這個名字指定上傳和下載的檔案 // 構造上傳請求 final String objectname = TimeUtil.getTimeMis() + ""; final String url = startpoint +"."+ endpoint+"/"+ objectname; PutObjectRequest put = new PutObjectRequest(startpoint, objectname, UiUtils.getImageAbsolutePath(SettingActivity.this,bitmap) ); // 非同步上傳時可以設定進度回撥 put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { } }); OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { //上傳成功後呼叫自己寫的傳到專案介面的方法 sethead(objectname); } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { // 請求異常 if (clientExcepion != null) { // 本地異常如網路異常等 clientExcepion.printStackTrace(); } if (serviceException != null) { } } }); }
到這裡,哪裡使用直接呼叫開啟相機或手機本地相簿方法就可以了