1. 程式人生 > >android 上傳圖片到阿里雲oss

android 上傳圖片到阿里雲oss

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) {
            }
        }
    });

}

到這裡,哪裡使用直接呼叫開啟相機或手機本地相簿方法就可以了