package com.forfan.bigbang.util;
import android.text.TextUtils;
import com.forfan.bigbang.BigBangApp;
import com.forfan.bigbang.R;
import com.forfan.bigbang.component.activity.screen.CaptureResultActivity;
import com.forfan.bigbang.component.base.BaseActivity;
import com.forfan.bigbang.entity.ImageUpload;
import com.forfan.bigbang.network.UploadUtil;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.microsoft.projectoxford.vision.VisionServiceRestClient;
import com.microsoft.projectoxford.vision.contract.LanguageCodes;
import com.microsoft.projectoxford.vision.contract.Line;
import com.microsoft.projectoxford.vision.contract.OCR;
import com.microsoft.projectoxford.vision.contract.Region;
import com.microsoft.projectoxford.vision.contract.Word;
import com.microsoft.projectoxford.vision.rest.VisionServiceException;
import com.microsoft.projectoxford.vision.rest.WebServiceRequest;
import com.shang.commonjar.contentProvider.SPHelper;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by wangyan-pd on 2016/11/19.
*/
public class OcrAnalsyser {
//别人的 00b0e581e4124a2583ea7dba57aaf281
// 我自己的 56c87e179c084cfaae9b70a2f58fa8d3 56c87e179c084cfaae9b70a2f58fa8d3
//彭露的 9e88939475894dec85a2019fd36243be
//进发的 eac11887004a4c88a7c3f527d6852bb3
//王岩2 cc750e4c195d497391e9fe18f6d21bae
static ArrayList<String> keys;
static {
keys = new ArrayList<>();
keys.add("9e88939475894dec85a2019fd36243be");
keys.add("56c87e179c084cfaae9b70a2f58fa8d3");
keys.add("eac11887004a4c88a7c3f527d6852bb3");
keys.add("cc750e4c195d497391e9fe18f6d21bae");
keys.add("ca5041c264f04f2e8c09f789ac19dbf1");
keys.add("2a681f188c9c43b3a6581f0b3d4e5de7");
keys.add("00b0e581e4124a2583ea7dba57aaf281");
}
//String[] keys = { "9e88939475894dec85a2019fd36243be", "56c87e179c084cfaae9b70a2f58fa8d3"};
int currentIndex = 0;
private static OcrAnalsyser instance = new OcrAnalsyser();
VisionServiceRestClient client = new VisionServiceRestClient(keys.get(currentIndex));
private String img_path;
Observable.OnSubscribe<OCR> mOnSubscrube = new Observable.OnSubscribe<OCR>() {
@Override
public void call(Subscriber<? super OCR> subscriber) {
client.setOnTimeUseUp(new WebServiceRequest.OnResult() {
@Override
public void onTimeUseUp() {
//返回403
currentIndex = (currentIndex + 1) % keys.size();
client = new VisionServiceRestClient(keys.get(currentIndex));
if (SPHelper.getString(ConstantUtil.DIY_OCR_KEY, "").equals("")) {
subscriber.onError(new IOException(BigBangApp.getInstance().getResources().getString(R.string.ocr_useup_toast)));
} else {
subscriber.onError(new IOException("time out"));
}
}
@Override
public void onSuccess() {
}
});
byte[] data = IOUtil.getBytes(img_path);
try {
String ocr = client.recognizeText(data, LanguageCodes.AutoDetect, verticalOrentation);
if (!TextUtils.isEmpty(ocr)) {
OCR ocrItem = new Gson().fromJson(ocr, new TypeToken<OCR>() {
}.getType());
subscriber.onNext(ocrItem);
}
} catch (VisionServiceException e) {
e.printStackTrace();
subscriber.onError(e);
} catch (IOException e) {
e.printStackTrace();
subscriber.onError(e);
}
}
};
private boolean verticalOrentation = true;
Observable.OnSubscribe<OCR> mOnSubscrube1 = new Observable.OnSubscribe<OCR>() {
@Override
public void call(Subscriber<? super OCR> subscriber) {
try {
client.setOnTimeUseUp(new WebServiceRequest.OnResult() {
@Override
public void onTimeUseUp() {
//返回403
currentIndex = (currentIndex + 1) % keys.size();
client = new VisionServiceRestClient(keys.get(currentIndex));
if (SPHelper.getString(ConstantUtil.DIY_OCR_KEY, "").equals("")) {
subscriber.onError(new IOException(BigBangApp.getInstance().getResources().getString(R.string.ocr_useup_toast)));
} else {
subscriber.onError(new IOException("time out"));
}
}
@Override
public void onSuccess() {
}
});
String ocr = client.recognizeText(img, LanguageCodes.AutoDetect, verticalOrentation);
if (!TextUtils.isEmpty(ocr)) {
OCR ocrItem = new Gson().fromJson(ocr, new TypeToken<OCR>() {
}.getType());
subscriber.onNext(ocrItem);
}
} catch (VisionServiceException e) {
e.printStackTrace();
subscriber.onError(e);
} catch (IOException e) {
e.printStackTrace();
subscriber.onError(e);
}
}
};
Observable.OnSubscribe<ImageUpload> mOnSubscrube2 = new Observable.OnSubscribe<ImageUpload>() {
@Override
public void call(Subscriber<? super ImageUpload> subscriber) {
try {
String json = UploadUtil.uploadFile(new File(seachPicPath));
if (!TextUtils.isEmpty(json)) {
ImageUpload imageUpload = new Gson().fromJson(json, new TypeToken<ImageUpload>() {
}.getType());
subscriber.onNext(imageUpload);
}else {
subscriber.onError(new Throwable("上传失败"));
}
} catch (Exception e) {
e.printStackTrace();
subscriber.onError(e);
}
}
};
private byte[] img;
private String seachPicPath;
public static OcrAnalsyser getInstance() {
return instance;
}
public void uploadImage(BaseActivity activity, String fileName, ImageUploadCallBack callback) {
this.seachPicPath = fileName;
Observable.create(mOnSubscrube2)
.subscribeOn(Schedulers.io())
.compose(activity.bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> callback.onSucess(s),
throwable -> {
callback.onFail(throwable);
});
}
public interface ImageUploadCallBack {
void onSucess(ImageUpload imageUpload);
void onFail(Throwable throwable);
}
public interface CallBack {
void onSucess(OCR ocr);
void onFail(Throwable throwable);
}
public void analyse(BaseActivity activity, String img_path, boolean isVertical, CallBack callback) {
// TextRecognizer textRecognizer = new TextRecognizer.Builder(context).build();
String diykey = SPHelper.getString(ConstantUtil.DIY_OCR_KEY, "");
if (!TextUtils.isEmpty(diykey) && !keys.contains(diykey)) {
keys.add(0, SPHelper.getString(ConstantUtil.DIY_OCR_KEY, ""));
currentIndex = 0;
client = new VisionServiceRestClient(keys.get(currentIndex));
}
if (callback == null)
return;
int time = SPHelper.getInt(ConstantUtil.OCR_TIME, 0) + 1;
SPHelper.save(ConstantUtil.OCR_TIME, time);
this.img_path = img_path;
this.verticalOrentation = isVertical;
Observable.create(mOnSubscrube)
.subscribeOn(Schedulers.io())
.compose(activity.bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> callback.onSucess(s),
throwable -> {
callback.onFail(throwable);
SPHelper.save(ConstantUtil.SHOULD_SHOW_DIY_OCR, true);
});
}
// public void analyse(byte[] img, CallBack callback) {
// if (callback == null)
// return;
// this.img = img;
// try {
// Observable.create(mOnSubscrube1)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(s -> callback.onSucess(s),
// throwable -> callback.onFail(throwable));
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
public String getPasedMiscSoftText(OCR ocr) {
String result = "";
for (Region reg : ocr.regions) {
for (Line line : reg.lines) {
for (Word word : line.words) {
result += word.text + " ";
}
result += "\n";
}
result += "\n\n";
}
if (ocr.language.equalsIgnoreCase(LanguageCodes.ChineseSimplified) || ocr.language.equalsIgnoreCase(LanguageCodes.ChineseTraditional)) {
result = result.replaceAll(" ", "");
}
if (TextUtils.isEmpty(result))
result = "no text found";
return result;
}
}