// 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');
}
// /***************** 选择相册图片功能和拍照功能****/
// 调用相机时传入的参数
private cameraOpt = {
quality: 100,//图片质量
sourceType: 1,
saveToPhotoAlbum: true,
correctOrientation: true,
};
// 调用相册时传入的参数
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' //不加入 发生错误!!
},
params: {}, //需要额外上传的参数
success: (data) => { alert(data); }, //图片上传成功后的回调
error: (err) => { }, //图片上传失败后的回调
listen: () => { } //监听上传过程
};
// 使用ionic中的ActionSheet组件
private useASComponent() {
let actionSheet = this.actionSheetCtrl.create({
title: '选择',
buttons: [
{
text: '拍照',
role: 'takePhoto',
handler: () => {
this.startCamera();
}
},
{
text: '从手机相册选择',
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;
}
// 打开手机相册
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();
// 设置录音参数: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();
// 监测录音状态的回调
mediaObj.onStatusUpdate.subscribe(status => this.showRecordStatus(status));
// 设置录音的长度,单位毫秒,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) {
// 设置上传参数
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(月和日不足两位补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());
}
// 根据录音状态码返回录音状态的方法
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)
);
}
}