// 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)
? ? ? );
? }
}