remove unuse codes and chinese code format

pull/8274/head
hukang hwx963878 4 years ago
parent 8254ad40b7
commit edde5724fe

@ -51,6 +51,11 @@ android {
packagingOptions{
pickFirst 'lib/arm64-v8a/libmlkit-label-MS.so'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
// Before gradle build.
@ -69,4 +74,15 @@ dependencies {
implementation 'com.sun.mail:android-mail:1.6.5'
implementation 'com.sun.mail:android-activation:1.6.5'
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
implementation 'org.greenrobot:eventbus:3.0.0'
}

@ -9,6 +9,8 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERNET" />
<application
@ -19,6 +21,10 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.actions"
android:resource="@xml/file_paths" />
<activity
android:name=".SplashActivity"
android:screenOrientation="portrait"
@ -53,6 +59,16 @@
android:name=".imageclassification.ui.ImageCameraActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.NoActionBar" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.mindspore.himindspore.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>

@ -1,34 +1,51 @@
package com.mindspore.himindspore;
import android.Manifest;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import androidx.core.content.FileProvider;
import com.mindspore.himindspore.imageclassification.ui.ImageCameraActivity;
import com.mindspore.himindspore.base.BaseActivity;
import com.mindspore.himindspore.imageclassification.ui.ImageMainActivity;
import com.mindspore.himindspore.mvp.MainContract;
import com.mindspore.himindspore.mvp.MainPresenter;
import com.mindspore.himindspore.net.FileDownLoadObserver;
import com.mindspore.himindspore.net.UpdateInfoBean;
import com.mindspore.himindspore.objectdetection.ui.ObjectDetectionMainActivity;
public class SplashActivity extends AppCompatActivity implements View.OnClickListener {
import java.io.File;
public class SplashActivity extends BaseActivity<MainPresenter> implements MainContract.View, View.OnClickListener {
private static final String TAG = "SplashActivity";
private static final int REQUEST_PERMISSION = 1;
private Button btnImage, btnObject, btnContract, btnAdvice;
private boolean isHasPermssion;
private ProgressDialog progressDialog;
private static final String CODE_URL = "https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/lite";
private static final String HELP_URL = "https://github.com/mindspore-ai/mindspore/issues";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
protected void init() {
presenter = new MainPresenter(this);
btnImage = findViewById(R.id.btn_image);
btnObject = findViewById(R.id.btn_object);
@ -41,6 +58,12 @@ public class SplashActivity extends AppCompatActivity implements View.OnClickLis
btnAdvice.setOnClickListener(this);
requestPermissions();
getUpdateInfo();
}
@Override
public int getLayout() {
return R.layout.activity_splash;
}
private void requestPermissions() {
@ -59,6 +82,11 @@ public class SplashActivity extends AppCompatActivity implements View.OnClickLis
}
}
private void getUpdateInfo() {
presenter.getUpdateInfo();
}
@Override
public void onClick(View view) {
if (R.id.btn_image == view.getId()) {
@ -87,4 +115,134 @@ public class SplashActivity extends AppCompatActivity implements View.OnClickLis
intent.setData(uri);
startActivity(intent);
}
@Override
public void showUpdateResult(UpdateInfoBean bean) {
showUpdate(bean);
}
@Override
public void showFail(String s) {
}
public void downSuccess() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("下载完成");
builder.setMessage("是否安装");
builder.setCancelable(false);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(SplashActivity.this, "com.mindspore.himindspore.fileprovider",
new File(getApkPath(), "HiMindSpore.apk"));
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(new File(getApkPath(), "HiMindSpore.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
startActivity(intent);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.create().show();
}
private int now_version;
public void showUpdate(final UpdateInfoBean updateInfo) {
try {
PackageManager packageManager = this.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0);
now_version = packageInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (now_version == updateInfo.getVersionCode()) {
Toast.makeText(this, "已经是最新版本", Toast.LENGTH_SHORT).show();
Log.d(TAG + "版本号是", "onResponse: " + now_version);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setTitle("请升级新版本" + updateInfo.getVersionName());
builder.setMessage(updateInfo.getMessage());
builder.setCancelable(false);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e(TAG, String.valueOf(Environment.MEDIA_MOUNTED));
downFile();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.create().show();
}
}
public void downFile() {
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle("正在下载");
progressDialog.setMessage("请稍候...");
progressDialog.setProgressNumberFormat("%1d Mb/%2d Mb");
progressDialog.setProgress(0);
progressDialog.show();
presenter.downloadApk(getApkPath(), "HiMindSpore.apk", new FileDownLoadObserver<File>() {
@Override
public void onDownLoadSuccess(File file) {
downSuccess();
}
@Override
public void onDownLoadFail(Throwable throwable) {
Toast.makeText(SplashActivity.this, "下载失败", Toast.LENGTH_LONG).show();
}
@Override
public void onProgress(final int progress, final long total) {
runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.setMax((int) total / 1024 / 1024);
progressDialog.setProgress(progress);
}
});
}
});
Log.d(TAG, "downFile: ");
}
public String getApkPath() {
String directoryPath = "";
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
directoryPath = getExternalFilesDir("apk").getAbsolutePath();
} else {
directoryPath = getFilesDir() + File.separator + "apk";
}
File file = new File(directoryPath);
Log.e("测试路径", directoryPath);
if (!file.exists()) {
file.mkdirs();
}
return directoryPath;
}
}

@ -0,0 +1,20 @@
package com.mindspore.himindspore.base;
import android.app.Activity;
import android.os.Bundle;
public abstract class BaseActivity<T extends BasePresenter> extends Activity {
protected T presenter;
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(getLayout());
init();
}
protected abstract void init();
public abstract int getLayout();
}

@ -0,0 +1,5 @@
package com.mindspore.himindspore.base;
public abstract class BasePresenter<T extends BaseActivity> {
protected T view;
}

@ -0,0 +1,4 @@
package com.mindspore.himindspore.base;
public interface TrackListener {
}

@ -37,8 +37,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import com.mindspore.himindspore.base.TrackListener;
import com.mindspore.himindspore.imageclassification.help.GarbageTrackingMobile;
import com.mindspore.himindspore.track.TrackListener;
import com.mindspore.himindspore.imageclassification.help.ImageTrackingMobile;
import com.mindspore.himindspore.objectdetection.help.ObjectTrackingMobile;

@ -1,12 +1,12 @@
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

@ -1,12 +1,12 @@
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -17,11 +17,10 @@
package com.mindspore.himindspore.imageclassification.help;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.util.Log;
import com.mindspore.himindspore.track.TrackListener;
import com.mindspore.himindspore.base.TrackListener;
import java.io.InputStream;
import java.nio.ByteBuffer;

@ -1,12 +1,12 @@
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -20,7 +20,7 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import com.mindspore.himindspore.track.TrackListener;
import com.mindspore.himindspore.base.TrackListener;
import java.io.InputStream;
import java.nio.ByteBuffer;

@ -1,12 +1,12 @@
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

@ -23,9 +23,7 @@ import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.UiThread;

@ -1,11 +1,11 @@
package com.mindspore.himindspore.imageclassification.ui;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.mindspore.himindspore.R;
public class ImageMainActivity extends AppCompatActivity {

@ -0,0 +1,22 @@
package com.mindspore.himindspore.mvp;
import com.mindspore.himindspore.net.FileDownLoadObserver;
import com.mindspore.himindspore.net.UpdateInfoBean;
import java.io.File;
public interface MainContract {
interface View {
void showUpdateResult(UpdateInfoBean object);
void showFail(String s);
}
interface Presenter {
void getUpdateInfo();
void downloadApk(String destDir, String fileName, FileDownLoadObserver<File> fileDownLoadObserver);
}
}

@ -0,0 +1,65 @@
package com.mindspore.himindspore.mvp;
import android.util.Log;
import com.mindspore.himindspore.SplashActivity;
import com.mindspore.himindspore.base.BasePresenter;
import com.mindspore.himindspore.net.FileDownLoadObserver;
import com.mindspore.himindspore.net.RetrofitHelper;
import com.mindspore.himindspore.net.UpdateInfoBean;
import java.io.File;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainPresenter extends BasePresenter<SplashActivity> implements MainContract.Presenter {
private static final String TAG = "MainPresenter";
private RetrofitHelper retrofitHelper;
public MainPresenter(SplashActivity mainActivity) {
this.view = mainActivity;
retrofitHelper = new RetrofitHelper();
}
@Override
public void getUpdateInfo() {
retrofitHelper.getUpdateInfo().enqueue(new Callback<UpdateInfoBean>() {
@Override
public void onResponse(Call<UpdateInfoBean> call, Response<UpdateInfoBean> response) {
Log.i(TAG, "onResponse" + response.toString());
view.showUpdateResult(response.body());
}
@Override
public void onFailure(Call<UpdateInfoBean> call, Throwable t) {
Log.e(TAG, "onFailure" + t.toString());
view.showFail(call.toString());
}
});
}
@Override
public void downloadApk(final String destDir, final String fileName, final FileDownLoadObserver<File> fileDownLoadObserver) {
retrofitHelper.downlaodApk()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.map(new Function<ResponseBody, File>() {
@Override
public File apply(@NonNull ResponseBody responseBody) throws Exception {
return fileDownLoadObserver.saveFile(responseBody, destDir, fileName);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(fileDownLoadObserver);
}
}

@ -0,0 +1,73 @@
package com.mindspore.himindspore.net;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import io.reactivex.observers.DefaultObserver;
import okhttp3.ResponseBody;
public abstract class FileDownLoadObserver<T> extends DefaultObserver<T> {
@Override
public void onNext(T t) {
onDownLoadSuccess(t);
}
@Override
public void onError(Throwable e) {
onDownLoadFail(e);
}
@Override
public void onComplete() {
}
public abstract void onDownLoadSuccess(T t);
public abstract void onDownLoadFail(Throwable throwable);
public abstract void onProgress(int progress, long total);
public File saveFile(ResponseBody responseBody, String destFileDir, String destFileName) throws IOException {
InputStream is = null;
byte[] buf = new byte[2048];
int len = 0;
FileOutputStream fos = null;
try {
is = responseBody.byteStream();
final long total = responseBody.contentLength();
long sum = 0;
File dir = new File(destFileDir);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, destFileName);
fos = new FileOutputStream(file);
while ((len = is.read(buf)) != -1) {
sum += len;
fos.write(buf, 0, len);
final long finalSum = sum;
onProgress((int) (finalSum * 100 / total), total);
}
fos.flush();
return file;
} finally {
try {
if (is != null) is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos != null) fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

@ -0,0 +1,45 @@
package com.mindspore.himindspore.net;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitHelper {
public static final String MS_BASE_HOST = "https://download.mindspore.cn/model_zoo/official/lite/apk/";
private RetrofitService retrofitService;
public RetrofitHelper() {
OkHttpClient httpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(30, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(MS_BASE_HOST)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
retrofitService = retrofit.create(RetrofitService.class);
}
public Call<UpdateInfoBean> getUpdateInfo() {
return retrofitService.getUpdateInfo();
}
public Observable<ResponseBody> downlaodApk() {
return retrofitService.downloadApk();
}
}

@ -0,0 +1,17 @@
package com.mindspore.himindspore.net;
import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Streaming;
public interface RetrofitService {
@GET("version.json")
Call<UpdateInfoBean> getUpdateInfo();
@Streaming
@GET("himindsporedemo.apk")
Observable<ResponseBody> downloadApk();
}

@ -0,0 +1,68 @@
package com.mindspore.himindspore.net;
public class UpdateInfoBean {
private int versionCode;
private String versionName;
private int forceUpdate;
private String create_time;
private String url;
private String md5;
private String message;
public int getVersionCode() {
return versionCode;
}
public void setVersionCode(int versionCode) {
this.versionCode = versionCode;
}
public String getVersionName() {
return versionName;
}
public void setVersionName(String versionName) {
this.versionName = versionName;
}
public int getForceUpdate() {
return forceUpdate;
}
public void setForceUpdate(int forceUpdate) {
this.forceUpdate = forceUpdate;
}
public String getCreate_time() {
return create_time;
}
public void setCreate_time(String create_time) {
this.create_time = create_time;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMd5() {
return md5;
}
public void setMd5(String md5) {
this.md5 = md5;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

@ -5,7 +5,7 @@ import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.util.Log;
import com.mindspore.himindspore.track.TrackListener;
import com.mindspore.himindspore.base.TrackListener;
import java.io.FileNotFoundException;
import java.io.InputStream;
@ -90,6 +90,7 @@ public class ObjectTrackingMobile implements TrackListener {
/**
* Unbound model
*
* @return true
*/
public boolean unloadModel() {
@ -99,6 +100,7 @@ public class ObjectTrackingMobile implements TrackListener {
/**
* Load model file stream
*
* @param modelPath Model file path
* @return Load model file stream
*/

@ -8,7 +8,6 @@ import androidx.appcompat.app.AppCompatActivity;
import com.mindspore.himindspore.R;
import com.mindspore.himindspore.camera.CameraPreview;
import com.mindspore.himindspore.imageclassification.help.ImageTrackingMobile;
import com.mindspore.himindspore.objectdetection.bean.RecognitionObjectBean;
import com.mindspore.himindspore.objectdetection.help.ObjectTrackingMobile;
@ -20,7 +19,7 @@ import static com.mindspore.himindspore.objectdetection.bean.RecognitionObjectBe
/**
* main page of entrance
*
* <p>
* Pass in pictures to JNI, test mindspore model, load reasoning, etc
*/

@ -17,11 +17,10 @@ import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.mindspore.himindspore.R;
import com.mindspore.himindspore.objectdetection.bean.RecognitionObjectBean;
import com.mindspore.himindspore.objectdetection.help.BitmapUtils;
import com.mindspore.himindspore.objectdetection.help.ObjectTrackingMobile;
import com.mindspore.himindspore.objectdetection.bean.RecognitionObjectBean;
import com.mindspore.himindspore.utils.DisplayUtil;
import java.io.FileNotFoundException;
@ -76,6 +75,8 @@ public class ObjectPhotoActivity extends AppCompatActivity {
this.imageUri = data.getData();
showOriginImage();
}
} else {
finish();
}
}
@ -148,7 +149,9 @@ public class ObjectPhotoActivity extends AppCompatActivity {
@Override
protected void onDestroy() {
super.onDestroy();
if (trackingMobile != null) {
trackingMobile.unloadModel();
}
BitmapUtils.recycleBitmap(originBitmap);
}

@ -2,7 +2,6 @@ package com.mindspore.himindspore.objectdetection.ui;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
@ -10,7 +9,6 @@ import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.mindspore.himindspore.R;
import com.mindspore.himindspore.objectdetection.bean.RecognitionObjectBean;
import com.mindspore.himindspore.utils.DisplayUtil;
@ -20,7 +18,7 @@ import java.util.List;
/**
* Rectangle drawing class for object detection
*
* <p>
* 1. CanvasRepresents the canvas attached to the specified view and uses its method to draw various graphics
* 2. PaintRepresents the brush on canvas and is used to set brush color, brush thickness, fill style, etc
*/
@ -98,7 +96,6 @@ public class ObjectRectView extends View {
}
public void drawRect(RecognitionObjectBean bean, Canvas canvas) {
StringBuilder sb = new StringBuilder();
sb.append(bean.getRectID()).append("_").append(bean.getObjectName()).append("_").append(String.format("%.2f", (100 * bean.getScore())) + "%");

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="Android/data/com.mindspore.himindspore/" name="files_root" />
<files-path
name="Android/data/com.mindspore.himindspore/"
path="files_root">
</files-path>
</paths>
Loading…
Cancel
Save