Android實現上傳本地或拍攝的視訊到Bmob伺服器
阿新 • • 發佈:2019-02-03
好久沒有更部落格了,今天來說說如何實現上傳本地或拍攝的視訊到Bmob伺服器吧。其實上傳檔案的程式碼格式都差不多,可以修改套用就能實現。
Adndroid中通過Intent 可以實現呼叫圖片、視訊、音訊、錄音、拍照等功能。例如呼叫圖片可以用如下格式:
//選擇圖片 requestCode 返回的標識
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
//"android.intent.action.GET_CONTENT"
intent.setType(contentType);
//檢視型別 ,可以在之前定義String IMAGE_UNSPECIFIED = "image/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);
//拍照 REQUEST_CODE_TAKE_PICTURE 為返回的標識
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//"android.media.action.IMAGE_CAPTURE";
intent.putExtra(MediaStore.EXTRA_OUTPUT, Mms.ScrapSpace.CONTENT_URI);
// output,Uri.parse("content://mms/scrapSpace");
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
呼叫視訊的格式如下:
//拍攝視訊
int durationLimit = getVideoCaptureDurationLimit();
//SystemProperties.getInt("ro.media.enc.lprof.duration", 60);
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, sizeLimit);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, durationLimit);
startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
//視訊
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(contentType); //String VIDEO_UNSPECIFIED = "video/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);
還有呼叫呼叫錄音,新增音訊的格式如下:
//新增音訊
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(contentType);
//String VIDEO_UNSPECIFIED = "video/*";
Intent wrapperIntent = Intent.createChooser(intent, null);
((Activity) context).startActivityForResult(wrapperIntent, requestCode);
//錄音
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(ContentType.AUDIO_AMR);
//String AUDIO_AMR = "audio/amr";
intent.setClassName("com.android.soundrecorder",
"com.android.soundrecorder.SoundRecorder");
((Activity) context).startActivityForResult(intent, requestCode);
本文著重講講如何呼叫視訊格式的功能,並上傳到Bmob伺服器。一開始使用以上的格式的程式碼時發現調用出現問題,通過查詢資料發現 “Intent intent = new Intent(Intent.ACTION_GET_CONTENT);”這個引用方法對Android 4.0以上版本並不適用,需要改成“Intent intent = new Intent(Intent.ACTION_PICK);”這個格式才能解決問題。開啟視訊檔案的目錄後選擇視訊,或者先選擇錄製視訊再選擇上傳,如圖所示效果:
下面貼上具體程式碼,首先是上傳本地視訊的格式程式碼:
Uri uri = data.getData();
File file = getFileByUri(uri);
MediaMetadataRetriever mmr=new MediaMetadataRetriever();//例項化MediaMetadataRetriever物件
mmr.setDataSource(file.getAbsolutePath());
Bitmap bitmap=mmr.getFrameAtTime();//獲得視訊第一幀的Bitmap物件
String duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//時長(毫秒)
Log.d("ddd","duration=="+duration);
int int_duration= Integer.parseInt(duration);
if(int_duration>300000){
Toast.makeText(getApplicationContext(), "視訊時長已超過5分鐘,請重新選擇", Toast.LENGTH_SHORT).show();
}
這裡我設定了視訊的時間限制,不能超過5分鐘,否則上傳失敗。上傳成功,在介面的下方會出現視訊第一幀的Bitmap影象。上傳成功後,Bmob伺服器中顯示的視訊格式如圖:
然後如果是拍攝的視訊,程式碼格式如下:
if (cursor != null && cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex(VideoColumns._ID));
String filePath = cursor.getString(cursor.getColumnIndex(VideoColumns.DATA));
bitmap1 = Thumbnails.getThumbnail(getContentResolver(), id, Thumbnails.MICRO_KIND, null);
// ThumbnailUtils類2.2以上可用
// Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(filePath,
// Thumbnails.MICRO_KIND);
Log.d("ddd", "filepath==" + filePath);
File file1=new File(filePath);
cursor.close();
//上傳到Bomb部分的程式碼
final BmobFile icon1 = new BmobFile(file1);
icon1.upload(this, new UploadFileListener() {
@Override
public void onSuccess() {
//Person person = new Person();
shipin.setDescribe(describe);
shipin.setTitle(title);
shipin.setIcon(icon1);
shipin.setAuthor(author);///////////////////////////
shipin.setUser(user1);///////////////////////////
shipin.setUsernames(usernames1);////////////////////////
shipin.setAtavars(avatars1);//////////////////////////
shipin.save(Ad2.this);
Toast.makeText(Ad2.this,"視訊上傳成功~",Toast.LENGTH_SHORT).show();
Toast.makeText(Ad2.this,"視訊發表成功~",Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int arg0, String arg1) {
Toast.makeText(Ad2.this,"上傳失敗,請檢查網路~",Toast.LENGTH_SHORT).show();
}
@Override
public void onProgress(Integer arg0) {//////////////////////////////123
// TODO Auto-generated method stub
}
});
ivHead.setImageBitmap(bitmap1);
btn_true.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}///////////////////
});//////////////
}
最後在貼一張執行後的效果圖:
別忘了新增許可權:
<uses-permission Android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
之後有機會再詳細說明視訊縮圖的獲取顯示~謝謝支援~!