MainActivity文件
package com.example.hmsdemo77;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.huawei.hmf.tasks.OnCompleteListener;
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hmf.tasks.Task;
import com.huawei.hms.common.ApiException;
import com.huawei.hms.location.FusedLocationProviderClient;
import com.huawei.hms.location.LocationCallback;
import com.huawei.hms.location.LocationRequest;
import com.huawei.hms.location.LocationResult;
import com.huawei.hms.location.LocationServices;
import com.huawei.hms.location.LocationSettingsRequest;
import com.huawei.hms.location.LocationSettingsResponse;
import com.huawei.hms.location.LocationSettingsStates;
import com.huawei.hms.location.SettingsClient;
import com.huawei.hms.mlsdk.MLAnalyzerFactory;
import com.huawei.hms.mlsdk.common.MLFrame;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionAnalyzer;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionAnalyzerFactory;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionAnalyzerSetting;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionConstant;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionCoordinateInput;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionResult;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewDetectResult;
import com.huawei.hms.mlsdk.text.MLLocalTextSetting;
import com.huawei.hms.mlsdk.text.MLText;
import com.huawei.hms.mlsdk.text.MLTextAnalyzer;
import com.huawei.hms.support.account.AccountAuthManager;
import com.huawei.hms.support.account.request.AccountAuthParams;
import com.huawei.hms.support.account.request.AccountAuthParamsHelper;
import com.huawei.hms.support.account.result.AuthAccount;
import com.huawei.hms.support.account.service.AccountAuthService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// 声明fusedLocationProviderClient对象
private FusedLocationProviderClient fusedLocationProviderClient;
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button authorization=findViewById(R.id.authorizationCode);
authorization.setOnClickListener(this);
Button idToken=findViewById(R.id.idToken);
idToken.setOnClickListener(this);
Button silentToken=findViewById(R.id.silentToken);
silentToken.setOnClickListener(this);
Button closeToken=findViewById(R.id.closeToken);
closeToken.setOnClickListener(this);
Button cancelToken=findViewById(R.id.cancelToken);
cancelToken.setOnClickListener(this);
Button location=findViewById(R.id.location);
location.setOnClickListener(this);
Button text=findViewById(R.id.text);
text.setOnClickListener(this);
Button correct=findViewById(R.id.correct);
correct.setOnClickListener(this);
image = findViewById(R.id.image);
// 实例化fusedLocationProviderClient对象
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
//利用Authorization Code方式登录
case R.id.authorizationCode:
AccountAuthParams authParams = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).setAuthorizationCode().createParams();
AccountAuthService service = AccountAuthManager.getService(MainActivity.this, authParams);
startActivityForResult(service.getSignInIntent(), 8888);
break;
//利用ID Token方式登录
case R.id.idToken:
AccountAuthParams authParams2 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).setIdToken().createParams();
AccountAuthService service2 = AccountAuthManager.getService(MainActivity.this, authParams2);
startActivityForResult(service2.getSignInIntent(), 9999);
break;
//利用静默登录方式登录
case R.id.silentToken:
AccountAuthParams authParams3 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).createParams();
AccountAuthService service3 = AccountAuthManager.getService(MainActivity.this, authParams3);
Task<AuthAccount> task = service3.silentSignIn();
task.addOnSuccessListener(new OnSuccessListener<AuthAccount>() {
@Override
public void onSuccess(AuthAccount authAccount) {
//获取帐号信息
Log.i("aaa", "displayName:" + authAccount.getDisplayName());
//获取帐号类型,0表示华为帐号、1表示AppTouch帐号
Log.i("aaa", "accountFlag:" + authAccount.getAccountFlag());
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
//登录失败,您可以尝试使用getSignInIntent()方法显式登录
if (e instanceof ApiException) {
ApiException apiException = (ApiException) e;
Log.i("aaa", "sign failed status:" + apiException.getStatusCode());
}
}
});
break;
//退出账号
case R.id.closeToken:
AccountAuthParams authParams4 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).createParams();
AccountAuthService service4 = AccountAuthManager.getService(MainActivity.this, authParams4);
Task<Void> signOutTask = service4.signOut();
signOutTask.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(Task<Void> task) {
//完成退出后的处理
Log.i("aaa", "signOut complete");
}
});
break;
//账号取消授权
case R.id.cancelToken:
AccountAuthParams authParams5 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).createParams();
AccountAuthService service5 = AccountAuthManager.getService(MainActivity.this, authParams5);
//service为登录授权时使用getService方法生成的AccountAuthService实例
service5.cancelAuthorization().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(Task<Void> task) {
if (task.isSuccessful()) {
//取消授权成功后的处理
Log.i("aaa", "onSuccess: ");
} else {
//异常处理
Exception exception = task.getException();
if (exception instanceof ApiException){
int statusCode = ((ApiException) exception).getStatusCode();
Log.i("aaa", "onFailure: " + statusCode);
}
}
}
});
break;
//融合定位开发
case R.id.location:
requestPermission();
SettingsClient settingsClient = LocationServices.getSettingsClient(this);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
LocationRequest mLocationRequest = new LocationRequest();
builder.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
// 检查设备定位设置
settingsClient.checkLocationSettings(locationSettingsRequest)
// 检查设备定位设置接口调用成功监听
.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
LocationSettingsStates locationSettingsStates =
locationSettingsResponse.getLocationSettingsStates();
StringBuilder stringBuilder = new StringBuilder();
// 定位开关是否打开
stringBuilder.append(",\nisLocationUsable=")
.append(locationSettingsStates.isLocationUsable());
// HMS Core是否可用
stringBuilder.append(",\nisHMSLocationUsable=")
.append(locationSettingsStates.isHMSLocationUsable());
Log.i("bbb", "checkLocationSetting onComplete:" + stringBuilder.toString());
}
})
// 检查设备定位设置接口失败监听回调
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.i("bbb", "checkLocationSetting onFailure:" + e.getMessage());
}
});
//持续定位
// LocationRequest mLocationRequest = new LocationRequest();
// 设置位置更新的间隔(单位:毫秒)
mLocationRequest.setInterval(10000);
// 设置定位类型
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
//启动定位
LocationCallback mLocationCallback;
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
if (locationResult != null) {
// TODO: 处理位置回调结果
List<Location> locationList = locationResult.getLocations();
for(int i = 0;i<locationList.size();i++){
Location location = locationList.get(i);
Log.d("bbb","海拔"+location.getAltitude());
}
}
}
};
fusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// TODO: 接口调用成功的处理
Log.d("bbb","定位启动接口调用成功");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// TODO: 接口调用失败的处理
Log.d("bbb","定位启动接口调用失败");
}
});
break;
//文本识别
case R.id.text:
//方式二:使用自定义参数MLLocalTextSetting配置端侧文本分析器。
MLLocalTextSetting setting = new MLLocalTextSetting.Factory()
.setOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
// 设置识别语种。
.setLanguage("zh")
.create();
MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);
// 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。
MLFrame frame = MLFrame.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.text));
Task<MLText> task1 = analyzer.asyncAnalyseFrame(frame);
task1.addOnSuccessListener(new OnSuccessListener<MLText>() {
@Override
public void onSuccess(MLText text) {
String recognizedText = text.getStringValue();
Log.d("aaa","文本识别成功"+recognizedText); //输出识别的文字
// 识别成功处理。
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.d("aaa","文本识别失败");
// 识别失败处理。
}
});
break;
//文档校正
case R.id.correct:
MLDocumentSkewCorrectionAnalyzerSetting setting1 = new MLDocumentSkewCorrectionAnalyzerSetting.Factory().create();
MLDocumentSkewCorrectionAnalyzer analyzer1 = MLDocumentSkewCorrectionAnalyzerFactory.getInstance().getDocumentSkewCorrectionAnalyzer(setting1);
MLFrame frame1 = MLFrame.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.correct));
// asyncDocumentSkewDetect异步调用。
Task<MLDocumentSkewDetectResult> detectTask = analyzer1.asyncDocumentSkewDetect(frame1);
// 异步检测文档倾斜
detectTask.addOnSuccessListener(new OnSuccessListener<MLDocumentSkewDetectResult>() {
@Override
public void onSuccess(MLDocumentSkewDetectResult detectResult) {
//获取文本框四个顶点的坐标数据并构建
Point leftTop = detectResult.getLeftTopPosition();
Point rightTop = detectResult.getRightTopPosition();
Point leftBottom = detectResult.getLeftBottomPosition();
Point rightBottom = detectResult.getRightBottomPosition();
List<Point> coordinates = new ArrayList<>();
coordinates.add(leftTop);
coordinates.add(rightTop);
coordinates.add(rightBottom);
coordinates.add(leftBottom);
MLDocumentSkewCorrectionCoordinateInput coordinateData = new MLDocumentSkewCorrectionCoordinateInput(coordinates);
// asyncDocumentSkewCorrect异步调用。
Task<MLDocumentSkewCorrectionResult> correctionTask = analyzer1.asyncDocumentSkewCorrect(frame1, coordinateData);
correctionTask.addOnSuccessListener(new OnSuccessListener<MLDocumentSkewCorrectionResult>() {
@Override
public void onSuccess(MLDocumentSkewCorrectionResult refineResult) {
Log.d("aaa","检测成功");
image.setImageBitmap(refineResult.getCorrected());
// 检测成功。
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.d("aaa","检测失败");
// 检测失败。
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.d("aaa","检测失败");
// 检测失败。
}
});
if (analyzer1 != null) {
try {
analyzer1.stop();
} catch (IOException e) {
Log.d("aaa", "停止分析器失败", e);
e.printStackTrace();
}
}
break;
}
}
private void requestPermission(){
// Android SDK<=28 所需权限动态申请
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
Log.i("bbb", "android sdk <= 28 Q");
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
String[] strings =
{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
ActivityCompat.requestPermissions(this, strings, 1);
}
} else {
// Android SDK>28 所需权限动态申请,需添加“android.permission.ACCESS_BACKGROUND_LOCATION”权限
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
"android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {
String[] strings = {android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
"android.permission.ACCESS_BACKGROUND_LOCATION"};
ActivityCompat.requestPermissions(this, strings, 2);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//授权登录结果处理,从AuthAccount中获取Authorization Code
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 8888) {
Task<AuthAccount> authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);
if (authAccountTask.isSuccessful()) {
//登录成功,获取用户的帐号信息和Authorization Code
AuthAccount authAccount = authAccountTask.getResult();
Log.i("aaa", "serverAuthCode:" + authAccount.getAuthorizationCode());
} else {
//登录失败
Log.e("aaa", "sign in failed:" + ((ApiException) authAccountTask.getException()).getStatusCode());
}
}
if(requestCode == 9999){
Task<AuthAccount> authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);
if (authAccountTask.isSuccessful()) {
//登录成功,获取用户的帐号信息和ID Token
AuthAccount authAccount = authAccountTask.getResult();
Log.i("aaa", "idToken:" + authAccount.getIdToken());
//获取帐号类型,0表示华为帐号、1表示AppTouch帐号
Log.i("aaa", "accountFlag:" + authAccount.getAccountFlag());
} else {
//登录失败,不需要做处理,打点日志方便定位
Log.e("aaa", "sign in failed : " +((ApiException) authAccountTask.getException()).getStatusCode());
}
}
}
}
package com.example.hmsdemo77;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.huawei.hmf.tasks.OnCompleteListener;
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hmf.tasks.Task;
import com.huawei.hms.common.ApiException;
import com.huawei.hms.location.FusedLocationProviderClient;
import com.huawei.hms.location.LocationCallback;
import com.huawei.hms.location.LocationRequest;
import com.huawei.hms.location.LocationResult;
import com.huawei.hms.location.LocationServices;
import com.huawei.hms.location.LocationSettingsRequest;
import com.huawei.hms.location.LocationSettingsResponse;
import com.huawei.hms.location.LocationSettingsStates;
import com.huawei.hms.location.SettingsClient;
import com.huawei.hms.mlsdk.MLAnalyzerFactory;
import com.huawei.hms.mlsdk.common.MLFrame;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionAnalyzer;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionAnalyzerFactory;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionAnalyzerSetting;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionConstant;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionCoordinateInput;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewCorrectionResult;
import com.huawei.hms.mlsdk.dsc.MLDocumentSkewDetectResult;
import com.huawei.hms.mlsdk.text.MLLocalTextSetting;
import com.huawei.hms.mlsdk.text.MLText;
import com.huawei.hms.mlsdk.text.MLTextAnalyzer;
import com.huawei.hms.support.account.AccountAuthManager;
import com.huawei.hms.support.account.request.AccountAuthParams;
import com.huawei.hms.support.account.request.AccountAuthParamsHelper;
import com.huawei.hms.support.account.result.AuthAccount;
import com.huawei.hms.support.account.service.AccountAuthService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// 声明fusedLocationProviderClient对象
private FusedLocationProviderClient fusedLocationProviderClient;
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button authorization=findViewById(R.id.authorizationCode);
authorization.setOnClickListener(this);
Button idToken=findViewById(R.id.idToken);
idToken.setOnClickListener(this);
Button silentToken=findViewById(R.id.silentToken);
silentToken.setOnClickListener(this);
Button closeToken=findViewById(R.id.closeToken);
closeToken.setOnClickListener(this);
Button cancelToken=findViewById(R.id.cancelToken);
cancelToken.setOnClickListener(this);
Button location=findViewById(R.id.location);
location.setOnClickListener(this);
Button text=findViewById(R.id.text);
text.setOnClickListener(this);
Button correct=findViewById(R.id.correct);
correct.setOnClickListener(this);
image = findViewById(R.id.image);
// 实例化fusedLocationProviderClient对象
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
//利用Authorization Code方式登录
case R.id.authorizationCode:
AccountAuthParams authParams = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).setAuthorizationCode().createParams();
AccountAuthService service = AccountAuthManager.getService(MainActivity.this, authParams);
startActivityForResult(service.getSignInIntent(), 8888);
break;
//利用ID Token方式登录
case R.id.idToken:
AccountAuthParams authParams2 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).setIdToken().createParams();
AccountAuthService service2 = AccountAuthManager.getService(MainActivity.this, authParams2);
startActivityForResult(service2.getSignInIntent(), 9999);
break;
//利用静默登录方式登录
case R.id.silentToken:
AccountAuthParams authParams3 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).createParams();
AccountAuthService service3 = AccountAuthManager.getService(MainActivity.this, authParams3);
Task<AuthAccount> task = service3.silentSignIn();
task.addOnSuccessListener(new OnSuccessListener<AuthAccount>() {
@Override
public void onSuccess(AuthAccount authAccount) {
//获取帐号信息
Log.i("aaa", "displayName:" + authAccount.getDisplayName());
//获取帐号类型,0表示华为帐号、1表示AppTouch帐号
Log.i("aaa", "accountFlag:" + authAccount.getAccountFlag());
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
//登录失败,您可以尝试使用getSignInIntent()方法显式登录
if (e instanceof ApiException) {
ApiException apiException = (ApiException) e;
Log.i("aaa", "sign failed status:" + apiException.getStatusCode());
}
}
});
break;
//退出账号
case R.id.closeToken:
AccountAuthParams authParams4 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).createParams();
AccountAuthService service4 = AccountAuthManager.getService(MainActivity.this, authParams4);
Task<Void> signOutTask = service4.signOut();
signOutTask.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(Task<Void> task) {
//完成退出后的处理
Log.i("aaa", "signOut complete");
}
});
break;
//账号取消授权
case R.id.cancelToken:
AccountAuthParams authParams5 = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).createParams();
AccountAuthService service5 = AccountAuthManager.getService(MainActivity.this, authParams5);
//service为登录授权时使用getService方法生成的AccountAuthService实例
service5.cancelAuthorization().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(Task<Void> task) {
if (task.isSuccessful()) {
//取消授权成功后的处理
Log.i("aaa", "onSuccess: ");
} else {
//异常处理
Exception exception = task.getException();
if (exception instanceof ApiException){
int statusCode = ((ApiException) exception).getStatusCode();
Log.i("aaa", "onFailure: " + statusCode);
}
}
}
});
break;
//融合定位开发
case R.id.location:
requestPermission();
SettingsClient settingsClient = LocationServices.getSettingsClient(this);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
LocationRequest mLocationRequest = new LocationRequest();
builder.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
// 检查设备定位设置
settingsClient.checkLocationSettings(locationSettingsRequest)
// 检查设备定位设置接口调用成功监听
.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
LocationSettingsStates locationSettingsStates =
locationSettingsResponse.getLocationSettingsStates();
StringBuilder stringBuilder = new StringBuilder();
// 定位开关是否打开
stringBuilder.append(",\nisLocationUsable=")
.append(locationSettingsStates.isLocationUsable());
// HMS Core是否可用
stringBuilder.append(",\nisHMSLocationUsable=")
.append(locationSettingsStates.isHMSLocationUsable());
Log.i("bbb", "checkLocationSetting onComplete:" + stringBuilder.toString());
}
})
// 检查设备定位设置接口失败监听回调
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.i("bbb", "checkLocationSetting onFailure:" + e.getMessage());
}
});
//持续定位
// LocationRequest mLocationRequest = new LocationRequest();
// 设置位置更新的间隔(单位:毫秒)
mLocationRequest.setInterval(10000);
// 设置定位类型
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
//启动定位
LocationCallback mLocationCallback;
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
if (locationResult != null) {
// TODO: 处理位置回调结果
List<Location> locationList = locationResult.getLocations();
for(int i = 0;i<locationList.size();i++){
Location location = locationList.get(i);
Log.d("bbb","海拔"+location.getAltitude());
}
}
}
};
fusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// TODO: 接口调用成功的处理
Log.d("bbb","定位启动接口调用成功");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// TODO: 接口调用失败的处理
Log.d("bbb","定位启动接口调用失败");
}
});
break;
//文本识别
case R.id.text:
//方式二:使用自定义参数MLLocalTextSetting配置端侧文本分析器。
MLLocalTextSetting setting = new MLLocalTextSetting.Factory()
.setOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
// 设置识别语种。
.setLanguage("zh")
.create();
MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);
// 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。
MLFrame frame = MLFrame.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.text));
Task<MLText> task1 = analyzer.asyncAnalyseFrame(frame);
task1.addOnSuccessListener(new OnSuccessListener<MLText>() {
@Override
public void onSuccess(MLText text) {
String recognizedText = text.getStringValue();
Log.d("aaa","文本识别成功"+recognizedText); //输出识别的文字
// 识别成功处理。
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.d("aaa","文本识别失败");
// 识别失败处理。
}
});
break;
//文档校正
case R.id.correct:
MLDocumentSkewCorrectionAnalyzerSetting setting1 = new MLDocumentSkewCorrectionAnalyzerSetting.Factory().create();
MLDocumentSkewCorrectionAnalyzer analyzer1 = MLDocumentSkewCorrectionAnalyzerFactory.getInstance().getDocumentSkewCorrectionAnalyzer(setting1);
MLFrame frame1 = MLFrame.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.correct));
// asyncDocumentSkewDetect异步调用。
Task<MLDocumentSkewDetectResult> detectTask = analyzer1.asyncDocumentSkewDetect(frame1);
// 异步检测文档倾斜
detectTask.addOnSuccessListener(new OnSuccessListener<MLDocumentSkewDetectResult>() {
@Override
public void onSuccess(MLDocumentSkewDetectResult detectResult) {
//获取文本框四个顶点的坐标数据并构建
Point leftTop = detectResult.getLeftTopPosition();
Point rightTop = detectResult.getRightTopPosition();
Point leftBottom = detectResult.getLeftBottomPosition();
Point rightBottom = detectResult.getRightBottomPosition();
List<Point> coordinates = new ArrayList<>();
coordinates.add(leftTop);
coordinates.add(rightTop);
coordinates.add(rightBottom);
coordinates.add(leftBottom);
MLDocumentSkewCorrectionCoordinateInput coordinateData = new MLDocumentSkewCorrectionCoordinateInput(coordinates);
// asyncDocumentSkewCorrect异步调用。
Task<MLDocumentSkewCorrectionResult> correctionTask = analyzer1.asyncDocumentSkewCorrect(frame1, coordinateData);
correctionTask.addOnSuccessListener(new OnSuccessListener<MLDocumentSkewCorrectionResult>() {
@Override
public void onSuccess(MLDocumentSkewCorrectionResult refineResult) {
Log.d("aaa","检测成功");
image.setImageBitmap(refineResult.getCorrected());
// 检测成功。
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.d("aaa","检测失败");
// 检测失败。
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.d("aaa","检测失败");
// 检测失败。
}
});
if (analyzer1 != null) {
try {
analyzer1.stop();
} catch (IOException e) {
Log.d("aaa", "停止分析器失败", e);
e.printStackTrace();
}
}
break;
}
}
private void requestPermission(){
// Android SDK<=28 所需权限动态申请
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
Log.i("bbb", "android sdk <= 28 Q");
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
String[] strings =
{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
ActivityCompat.requestPermissions(this, strings, 1);
}
} else {
// Android SDK>28 所需权限动态申请,需添加“android.permission.ACCESS_BACKGROUND_LOCATION”权限
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
"android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {
String[] strings = {android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
"android.permission.ACCESS_BACKGROUND_LOCATION"};
ActivityCompat.requestPermissions(this, strings, 2);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//授权登录结果处理,从AuthAccount中获取Authorization Code
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 8888) {
Task<AuthAccount> authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);
if (authAccountTask.isSuccessful()) {
//登录成功,获取用户的帐号信息和Authorization Code
AuthAccount authAccount = authAccountTask.getResult();
Log.i("aaa", "serverAuthCode:" + authAccount.getAuthorizationCode());
} else {
//登录失败
Log.e("aaa", "sign in failed:" + ((ApiException) authAccountTask.getException()).getStatusCode());
}
}
if(requestCode == 9999){
Task<AuthAccount> authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);
if (authAccountTask.isSuccessful()) {
//登录成功,获取用户的帐号信息和ID Token
AuthAccount authAccount = authAccountTask.getResult();
Log.i("aaa", "idToken:" + authAccount.getIdToken());
//获取帐号类型,0表示华为帐号、1表示AppTouch帐号
Log.i("aaa", "accountFlag:" + authAccount.getAccountFlag());
} else {
//登录失败,不需要做处理,打点日志方便定位
Log.e("aaa", "sign in failed : " +((ApiException) authAccountTask.getException()).getStatusCode());
}
}
}
}
activity_main文件
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<Button
android:id="@+id/authorizationCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录"/>
<Button
android:id="@+id/idToken"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="idToken登录"/>
<Button
android:id="@+id/silentToken"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="静默登录"/>
<Button
android:id="@+id/closeToken"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="退出登录"/>
<Button
android:id="@+id/cancelToken"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取消授权"/>
<Button
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="定位开关"/>
<Button
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="文本识别"/>
<Button
android:id="@+id/correct"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="文本矫正"/>
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/correct"/>
</LinearLayout>
AndroidManifest准备
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.hmsdemo77">
<application
tools:replace="android:allowBackup"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HmsDemo77"
android:usesCleartextTraffic="true">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.huawei.hms.client.channel.androidMarket" android:value="false" />
<meta-data
android:name="com.huawei.hms.ml.DEPENDENCY"
android:value= "dsc"
/>
</application>
<queries>
<intent>
<action android:name="com.huawei.hms.core.aidlservice" />
</intent>
</queries>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.hmsdemo77">
<application
tools:replace="android:allowBackup"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HmsDemo77"
android:usesCleartextTraffic="true">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.huawei.hms.client.channel.androidMarket" android:value="false" />
<meta-data
android:name="com.huawei.hms.ml.DEPENDENCY"
android:value= "dsc"
/>
</application>
<queries>
<intent>
<action android:name="com.huawei.hms.core.aidlservice" />
</intent>
</queries>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>