ionic3 調(diào)取照片機(jī),音頻,視頻插件 上傳服務(wù)器

// import { HttpClient } from '@angular/common/http';


import { Injectable } from '@angular/core';


import { ImagePicker } from '@ionic-native/image-picker';//引入插件


import { ActionSheetController, Platform } from 'ionic-angular';

import { Camera } from '@ionic-native/camera'; //引入插件

import { Media, MediaObject } from '@ionic-native/media';

import { File } from '@ionic-native/file'; //引入插件

import { MediaCapture, CaptureVideoOptions, MediaFile, CaptureError, CaptureAudioOptions } from '@ionic-native/media-capture';

import { HttpService, AppGlobal } from '../../providers/http.service';

import { FileTransfer, FileTransferObject, FileUploadOptions } from '@ionic-native/file-transfer';

import { DatePipe } from '@angular/common';

/*

? Generated class for the ProblemReportingProvider provider.

? See https://angular.io/guide/dependency-injection for more info on providers

? and Angular DI.

*/

declare var cordova: any;

@Injectable()

export class ProblemReportingProvider {

? isAudioOrVedio = true;

? userParam = {

? ? "description": "測試",

? ? "sitePhotos": "測試",

? ? "phone": "測試",

? ? "eventTime": null,

? ? "eventAddress": "測試",

? ? "appid": "測試",

? ? "status": 1,

? ? "remark": "測試",

? ? "video": null,

? ? "voice": null

? };

? static _files = []

? private set files(value) {

? ? ProblemReportingProvider._files;

? }

? private get files() {

? ? return ProblemReportingProvider._files;

? }

? selectType: any = [];

? playAudio: any = true;

? filemenu = [];

? // public filePath: any; //錄音文件的名字

? // public recordData: any; //錄音對象

? storageDirectory: string = '';

? fileName: string = '';

? fileTransfer: FileTransferObject = this.transfer.create();

? constructor(private camera: Camera, private imagePicker: ImagePicker,

? ? public actionSheetCtrl: ActionSheetController, private file: File,

? ? private media: Media, private mediaCapture: MediaCapture, private httpservice: HttpService, private transfer: FileTransfer, public platform: Platform, ) {

? ? this.platform.ready().then(() => {

? ? ? // make sure this is on a device, not an emulation (e.g. chrome tools device mode)

? ? ? if (!this.platform.is('cordova')) {

? ? ? ? return false;

? ? ? }

? ? ? if (this.platform.is('ios')) {

? ? ? ? this.storageDirectory = cordova.file.tempDirectory;

? ? ? }

? ? ? else if (this.platform.is('android')) {

? ? ? ? this.storageDirectory = cordova.file.dataDirectory;

? ? ? }

? ? ? else {

? ? ? ? // exit otherwise, but you could add further types here e.g. Windows

? ? ? ? return false;

? ? ? }

? ? });

? ? console.log('Hello ProblemReportingProvider Provider');

? }

? // /***************** 選擇相冊圖片功能和拍照功能****/

? // 調(diào)用相機(jī)時傳入的參數(shù)

? private cameraOpt = {

? ? quality: 100,//圖片質(zhì)量

? ? sourceType: 1,

? ? saveToPhotoAlbum: true,

? ? correctOrientation: true,

? };

? // 調(diào)用相冊時傳入的參數(shù)

? private imagePickerOpt = {

? ? maximumImagesCount: 5 - this.selectType.length,//選擇一張圖片

? ? quality: 80

? };

? showPicActionSheet() {

? ? this.useASComponent();

? }

? upload: any = {

? ? url: 'http://************',? ? ? ? ? //接收圖片的url

? ? fileKey: '',? //接收圖片時的key

? ? headers: {

? ? ? 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' //不加入 發(fā)生錯誤!!

? ? },

? ? params: {},? ? ? ? //需要額外上傳的參數(shù)

? ? success: (data) => { alert(data); }, //圖片上傳成功后的回調(diào)

? ? error: (err) => { },? //圖片上傳失敗后的回調(diào)

? ? listen: () => { }? //監(jiān)聽上傳過程

? };

? // 使用ionic中的ActionSheet組件

? private useASComponent() {

? ? let actionSheet = this.actionSheetCtrl.create({

? ? ? title: '選擇',

? ? ? buttons: [

? ? ? ? {

? ? ? ? ? text: '拍照',

? ? ? ? ? role: 'takePhoto',

? ? ? ? ? handler: () => {

? ? ? ? ? ? this.startCamera();

? ? ? ? ? }

? ? ? ? },

? ? ? ? {

? ? ? ? ? text: '從手機(jī)相冊選擇',

? ? ? ? ? role: 'chooseFromAlbum',

? ? ? ? ? handler: () => {

? ? ? ? ? ? this.openImgPicker();

? ? ? ? ? }

? ? ? ? },

? ? ? ? {

? ? ? ? ? text: '取消',

? ? ? ? ? role: 'cancel',

? ? ? ? ? handler: () => {

? ? ? ? ? ? console.log("cancel");

? ? ? ? ? }

? ? ? ? }

? ? ? ]

? ? });

? ? actionSheet.present().then(value => {

? ? ? return value;

? ? });;

? }

? // 啟動拍照功能

? private startCamera() {

? ? const thisFrom = this;

? ? this.camera.getPicture(this.cameraOpt).then((imageData) => {

? ? ? this.selectType.push(imageData);

? ? ? this.uploadImg(imageData);

? ? ? alert('startCamera');

? ? ? alert(imageData);

? ? ? thisFrom.getCaption(imageData);

? ? ? let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

? ? ? this.filemenu.push({

? ? ? ? name: imageData,

? ? ? ? datetime: thisdate,

? ? ? ? url: AppGlobal.domain + imageData,

? ? ? ? filetype: '圖片'

? ? ? });

? ? }, (err) => {

? ? ? this.httpservice.toast('ERROR:' + err); //錯誤:無法使用拍照功能!

? ? });

? }

? //截取字符

? getCaption(obj) {

? ? let index = obj.lastIndexOf('\/');

? ? obj = obj.substring(index + 1, obj.length);

? ? alert(obj);

? ? return obj;

? }

? // 打開手機(jī)相冊

? private openImgPicker() {

? ? const thisForm = this;

? ? this.imagePicker.getPictures(this.imagePickerOpt)

? ? ? .then((results) => {

? ? ? ? for (var i = 0; i < results.length; i++) {

? ? ? ? ? thisForm.selectType.push(results[i]);

? ? ? ? ? this.uploadImg(results[i]);

? ? ? ? ? alert('startCamera');

? ? ? ? ? alert(results[i]);

? ? ? ? ? thisForm.getCaption(results[i])

? ? ? ? ? let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

? ? ? ? ? this.filemenu.push({

? ? ? ? ? ? name: results[i].name,

? ? ? ? ? ? datetime: thisdate,

? ? ? ? ? ? url: AppGlobal.domain + results[i],

? ? ? ? ? ? filetype: '圖片'

? ? ? ? ? });

? ? ? ? }

? ? ? ? // alert('openImgPicker');

? ? ? ? // alert(thisForm.selectType);

? ? ? }, (err) => {

? ? ? ? this.httpservice.toast('ERROR:' + err); //錯誤:無法使用拍照功能!

? ? ? });

? }

? // 上傳圖片

? public uploadImg(path: string) {

? ? if (!path) {

? ? ? return;

? ? }

? ? // alert('uploadImg');

? ? // alert(path);

? ? // this.fileTransfer = new Transfer();

? ? let options: any;

? ? options = {

? ? ? fileKey: this.upload.fileKey,

? ? ? headers: this.upload.headers,

? ? ? // params: this.upload.params

? ? };

? ? alert(this.upload.url);

? ? const thisForm = this;

? ? this.fileTransfer.upload(path, thisForm.upload.url + '/image', options)

? ? ? .then((data) => {

? ? ? ? alert('fileTransfer.upload uploadImg');

? ? ? ? if (this.upload.success) {

? ? ? ? ? this.upload.success(JSON.parse(data.response));

? ? ? ? ? alert(this.upload.success(JSON.parse(data.response)));

? ? ? ? }

? ? ? }, (err) => {

? ? ? ? if (this.upload.error) {

? ? ? ? ? this.upload.error(err);

? ? ? ? } else {

? ? ? ? ? this.httpservice.toast('ERROR:' + err);

? ? ? ? }

? ? ? });

? }

? // 停止上傳

? stopUpload() {

? ? if (this.fileTransfer) {

? ? ? this.fileTransfer.abort();

? ? }

? }

? // 刪除圖片

? onClickDetelePic(i) {

? ? this.selectType.splice(i, 1);

? }

? /*****************************錄制音頻*************************************/

? // cordova-plugin-media-capture 的使用

? startRecording_MediaCapture() {

? ? this.platform.ready().then(() => {

? ? ? // const ftObj: FileTransferObject = this.transfer.create();

? ? ? // 設(shè)置錄音參數(shù):duration限制錄音長度,單位秒,僅ios有效

? ? ? let options: CaptureAudioOptions = { limit: 1, duration: 10 };

? ? ? const thisForm = this;

? ? ? this.mediaCapture.captureAudio(options)

? ? ? ? .then(

? ? ? ? ? function (mediaFiles: MediaFile[]) {

? ? ? ? ? ? var i, len;

? ? ? ? ? ? for (i = 0, len = mediaFiles.length; i < len; i += 1) {

? ? ? ? ? ? ? // alert("Record success! \n\n"

? ? ? ? ? ? ? //? + "file name: " + mediaFiles[i].name + "\n\n"

? ? ? ? ? ? ? //? + "size: " + (mediaFiles[i].size / 1024).toFixed(2) + "KB" + "\n\n"

? ? ? ? ? ? ? //? + "fullPath: " + mediaFiles[i].fullPath + "\n\n"

? ? ? ? ? ? ? //? + "lastModifiedDate: " + (mediaFiles[i].lastModifiedDate) + "\n\n"

? ? ? ? ? ? ? //? + "type: " + mediaFiles[i].type + "\n\n");

? ? ? ? ? ? ? // 上傳

? ? ? ? ? ? ? thisForm.fileName = mediaFiles[i].name;

? ? ? ? ? ? ? thisForm.uploadFile(mediaFiles[i].fullPath, '/voile');

? ? ? ? ? ? }

? ? ? ? ? },

? ? ? );

? ? });

? }

? // cordova-plugin-media 的使用

? startRecording_Media() {

? ? this.platform.ready().then(() => {

? ? ? let mediaObj;

? ? ? var recordName = this.generateFileName() + ".wav";

? ? ? this.fileName = recordName;

? ? ? if (this.platform.is('ios')) {

? ? ? ? this.file.createFile(this.file.documentsDirectory, recordName, true).then(() => {

? ? ? ? ? mediaObj = this.media.create(this.file.documentsDirectory.replace(/^file:\/\//, '') + recordName);

? ? ? ? ? this.doRecord_Media(mediaObj);

? ? ? ? });

? ? ? } else if (this.platform.is('android')) {

? ? ? ? mediaObj = this.media.create(this.file.documentsDirectory || this.file.externalDataDirectory + recordName);

? ? ? ? this.doRecord_Media(mediaObj);

? ? ? } else {

? ? ? ? alert("Not cordova!");

? ? ? ? return;

? ? ? }

? ? });

? }

? doRecord_Media(mediaObj: MediaObject) {

? ? // 開始錄音

? ? mediaObj.startRecord();

? ? // 監(jiān)測錄音狀態(tài)的回調(diào)

? ? mediaObj.onStatusUpdate.subscribe(status => this.showRecordStatus(status));

? ? // 設(shè)置錄音的長度,單位毫秒,ios / android 均有效

? ? window.setTimeout(() => mediaObj.stopRecord(), 10 * 1000);

? ? // 錄音成功后的處理,如上傳錄音

? ? mediaObj.onSuccess.subscribe(() => {

? ? ? this.uploadFile(this.file.documentsDirectory || this.file.externalDataDirectory + this.fileName, '/voile')

? ? ? this.isAudioOrVedio = true;

? ? ? let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

? ? ? this.filemenu.push({

? ? ? ? name: this.file.documentsDirectory || this.file.externalDataDirectory + this.fileName,

? ? ? ? datetime: thisdate,

? ? ? ? url: AppGlobal.domain + this.file.documentsDirectory || this.file.externalDataDirectory + this.fileName,

? ? ? ? filetype: this.isAudioOrVedio ? '音頻' : '視頻'

? ? ? })

? ? });

? ? // 錄音失敗后的處理,如提示錯誤碼

? ? mediaObj.onError.subscribe(error => alert('Record fail! Error: ' + error));

? }

? // 上傳 File Transfer Plugin 的使用

? uploadFile(filePath, path) {

? ? // 設(shè)置上傳參數(shù)

? ? let options: FileUploadOptions = {

? ? ? fileKey: "file",

? ? ? fileName: this.fileName,

? ? ? mimeType: this.isAudioOrVedio ? "audio/wav" : "vedio/mp4"

? ? };

? ? const ftObj: FileTransferObject = this.transfer.create();

? ? const thisForm = this;

? ? // alert("filePath:" + filePath);

? ? ftObj.upload(filePath,

? ? ? encodeURI(thisForm.upload.url + path), options).then(

? ? ? ? (data) => {

? ? ? ? ? alert(JSON.parse(data.response));

? ? ? ? },

? ? ? ? (err) => {

? ? ? ? ? alert("File upload fail! error:" + err.code);

? ? ? ? });

? }

? // 生成錄音文件名的方法:yyyymmddhhmmss(月和日不足兩位補(bǔ)0)

? complement(n) { return n < 10 ? '0' + n : n }

? generateFileName() {

? ? var date = new Date();

? ? return date.getFullYear().toString() + this.complement(date.getMonth() + 1) + this.complement(date.getDate()) + this.complement(date.getHours()) + this.complement(date.getMinutes()) + this.complement(date.getSeconds());

? }

? // 根據(jù)錄音狀態(tài)碼返回錄音狀態(tài)的方法

? showRecordStatus(status) {

? ? var statusStr = "";

? ? switch (status) {

? ? ? case 0:

? ? ? ? statusStr = "None";

? ? ? ? break;

? ? ? case 1:

? ? ? ? statusStr = "Start";

? ? ? ? break;

? ? ? case 2:

? ? ? ? statusStr = "Running";

? ? ? ? break;

? ? ? case 3:

? ? ? ? statusStr = "Paused";

? ? ? ? break;

? ? ? case 4:

? ? ? ? statusStr = "Stopped";

? ? ? ? break;

? ? ? default:

? ? ? ? statusStr = "None";

? ? }

? ? this.httpservice.toast("status: " + statusStr);

? }

? /***********************視頻************************** */

? onClikeVedio() {

? ? let options: CaptureVideoOptions = { limit: 1 };

? ? const thisForm = this;

? ? this.mediaCapture.captureVideo(options)

? ? ? .then(

? ? ? ? (mediaFiles: MediaFile[]) => {

? ? ? ? ? var i, len;

? ? ? ? ? for (i = 0, len = mediaFiles.length; i < len; i += 1) {

? ? ? ? ? ? // alert("Record success! \n\n"

? ? ? ? ? ? //? + "file name: " + mediaFiles[i].name + "\n\n"

? ? ? ? ? ? //? + "size: " + (mediaFiles[i].size / 1024).toFixed(2) + "KB" + "\n\n"

? ? ? ? ? ? //? + "fullPath: " + mediaFiles[i].fullPath + "\n\n"

? ? ? ? ? ? //? + "lastModifiedDate: " + (mediaFiles[i].lastModifiedDate) + "\n\n"

? ? ? ? ? ? //? + "type: " + mediaFiles[i].type + "\n\n");

? ? ? ? ? ? // 上傳

? ? ? ? ? ? thisForm.fileName = mediaFiles[i].name;

? ? ? ? ? ? thisForm.uploadFile(mediaFiles[i].fullPath, '/video');

? ? ? ? ? ? this.isAudioOrVedio = false;

? ? ? ? ? ? let thisdate = new DatePipe('en-US').transform(new Date(), 'yyyy-MM-dd HH:mm:ss');

? ? ? ? ? ? this.filemenu.push({

? ? ? ? ? ? ? name: mediaFiles[i].name,

? ? ? ? ? ? ? datetime: thisdate,

? ? ? ? ? ? ? url: AppGlobal.domain + mediaFiles[i].fullPath,

? ? ? ? ? ? ? filetype: this.isAudioOrVedio ? '音頻' : '視頻'

? ? ? ? ? ? })

? ? ? ? ? }

? ? ? ? },

? ? ? ? (err: CaptureError) => this.httpservice.toast('ERROR:' + err)

? ? ? );

? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內(nèi)容