先說本文主要的重點:
七牛雲上傳圖片(包括從相機獲取的和從相冊獲取的) 七牛雲上傳視頻 8.0手機調起相機 都會進行描述 多圖片和多視頻上傳 獲取圖片後綴 隱藏軟鍵盤
1、導入七牛雲的依賴
//七牛雲
api 'com.qiniu:qiniu-android-sdk:7.3.+'
api 'pub.devrel:easypermissions:0.4.3'
api 'com.qiniu:happy-dns:0.2.13'
api 'com.loopj.android:android-async-http:1.4.9'
2、添加七牛雲的工具類
https://download.csdn.net/download/jing_80/10832747 可以下載,我已上傳
3、因爲出於保護數據 所以中間的字符用xxxxx代替,這兩個變量在七牛雲上可以獲取到,這個很重要,這個是獲取七牛雲Token需要用到的,不過我們這裏的token是我們的後臺返給我的,所以各位小夥伴看情況而定
public static final String AccessKey = "-lOgC9xxxxxxxxxxxxiHIBDSrIZ";
public static final String SecretKey = "PYCGWxxxxxxxxxxxxxxxKw0F0v0B0Sty4m";
4、前面的準備工作做完之後,來吧,接下來我們要寫真正的上傳代碼了,一步一步來
如果你是準備好了相機相冊各種權限的 就不說了 直接看(2)
如果你是什麼也沒寫,那就先添加上調用相機所用的權限吧! 先看(1)
(1)在res下創建xml文件
xml文件中的內容:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path path="" name="camera_photos" />
</paths>
再在AndroidManifest中添加代碼和權限 權限可能不夠 需要什麼再添加
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.camera" />
<!-- 相機權限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 寫入SD卡的權限:如果你希望保存相機拍照後的照片 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 讀取SD卡的權限:打開相冊選取圖片所必須的權限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在AndroidManifest中添加 這個provider和activity同級的
<!-- 8.0相機 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path" />
</provider>
(2)七牛雲上傳代碼
public class UploadDynamicActivity implements View.OnClickListener {
private static final int REQUEST_CODE_VIDEO = 0x00000012;
private static final int REQUEST_CODE_CAMERA = 0x00000011;
private static final int REQUEST_CODE_ALBUM = 0x00000010;
private String upPath,videoThumb;
private String headpicPath;
private Uri uri;
private File file;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 12) {
String headpicPaths = (String) msg.obj;
if (headpicPaths != null) {
// headpicPaths是七牛雲返回的地址 這裏寫自己的處理
}
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_CAMERA:
if (resultCode == RESULT_OK) {
upPath = file.getAbsolutePath();
break;
}
case REQUEST_CODE_ALBUM:
if (resultCode == RESULT_OK) {
Uri uriAlbum = data.getData();
upPath = fromImageUriGetPath(uriAlbum);
break;
}
case REQUEST_CODE_VIDEO:
if (resultCode == RESULT_OK) {
//從相冊選取視頻
Uri selectedVideo = data.getData();
upPath = fromVideoUriGetPath(selectedVideo);
break;
}
break;
}
}
// 利用獲取到的圖片Uri 在獲取到圖片對應的path
private String fromImageUriGetPath(Uri uri) {
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
//picturePath就是圖片在儲存卡所在的位置
String picturePath = cursor.getString(columnIndex);
cursor.close();
return picturePath;
}
// 利用獲取到的視頻Uri 在獲取到視頻對應的path
private String fromVideoUriGetPath(Uri uri) {
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri,
new String[]{MediaStore.Video.Media.DATA}, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
//picturePath就是圖片在儲存卡所在的位置
String picturePaths = cursor.getString(columnIndex);
//這個videoThumb是獲取該視頻縮略圖的地址 至於怎麼獲取的縮略圖 我的博客裏有 獲取網絡的 獲取本地的 只需要視頻地址就可以
Bitmap netVideoBitmap = VideoFrameUtils.getLocalVideoBitmap(picturePaths);
videoThumb = VideoFrameUtils.saveBitmap(UploadDynamicActivity.this, netVideoBitmap);
cursor.close();
return picturePaths;
}
//上傳圖片或視頻到七牛雲的方法
private void uploadInfoToQiNiu(final String path) {
new Thread(new Runnable() {
@Override
public void run() {
String picSuffix = getPicSuffix(path);
String randomNumCode = getRandomNumCode();
// 設置圖片名字
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String key = "icon_" + sdf.format(new Date()) + randomNumCode + "." + picSuffix;
UploadManager uploadManager = new UploadManager();
//這個getQNToken需要從後臺獲取 或者是自己從七牛雲上找方法獲取
uploadManager.put(path, key, getQNToken, new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info, JSONObject res) {
if (info.isOK()) {
//這個是你將圖片上傳之後七牛雲給你返回的地址 這個需要傳給你們的後臺
headpicPath = "http://qiniu.bjmocang.com/" + key;
Message message = handler.obtainMessage(12, headpicPath);
handler.sendMessage(message);
} else {
Log.e("tagxx", info.error);
}
}
}, null);
}
}).start();
}
//調取相機
private void fromCamera() {
file = new File(Environment.getExternalStorageDirectory(), SystemClock.uptimeMillis() + ".jpg");
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", file);
} else {
uri = Uri.fromFile(file);
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.相機:
fromCamera();
break;
case R.id.相冊:
Intent intentAlbum = new Intent(Intent.ACTION_PICK);
intentAlbum.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intentAlbum, REQUEST_CODE_ALBUM);
break;
case R.id.視頻:
Intent intentVideo = new Intent(Intent.ACTION_PICK);
intentVideo.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*");
startActivityForResult(intentVideo, REQUEST_CODE_VIDEO);
break;
}
}
@AfterPermissionGranted(1)//添加註解,是爲了首次執行權限申請後,回調該方法
private void methodRequiresTwoPermission() {
String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(this, perms)) {
//已經申請過權限,直接調用相機
// openCamera();
} else {
EasyPermissions.requestPermissions(this, "需要獲取權限", 1, perms);
}
}
//生成四位隨機數
public static String getRandomNumCode() {
String codeNum = "";
int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Random random = new Random();
for (int i = 0; i < 4; i++) {
int next = random.nextInt(10000);
codeNum += numbers[next % 10];
}
return codeNum;
}
/**
* 獲取圖片後綴
*
* @param img_path 圖片或者視頻路徑
* @return
*/
public static String getPicSuffix(String img_path) {
if (img_path == null || img_path.indexOf(".") == -1) {
return ""; //如果圖片地址爲null或者地址中沒有"."就返回""
}
return img_path.substring(img_path.lastIndexOf(".") + 1).
trim().toLowerCase();
}
//設置點擊任意空白處隱藏鍵盤
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 獲得當前得到焦點的View,一般情況下就是EditText(特殊情況就是軌跡求或者實體案件會移動焦點)
View v = getCurrentFocus();
if (HideInputUtil.isShouldHideInput(v, ev)) {
hideSoftInput(v.getWindowToken());
}
}
return super.dispatchTouchEvent(ev);
}
/**
* 隱藏軟鍵盤
*
* @param token
*/
private void hideSoftInput(IBinder token) {
if (token != null) {
InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
5、好了,到這裏就結束了。希望能幫助到各位博友