增加databinding 基类

This commit is contained in:
2025-07-20 17:53:47 +08:00
parent ef63f194ab
commit b3fcc019f8
13 changed files with 537 additions and 46 deletions

View File

@@ -117,6 +117,10 @@
android:resource="@xml/provider_paths" />
</provider>
<meta-data
android:name="com.ttstd.elderlyassistant.annotations.CustomGlideModule"
android:value="AppGlideModule" />
<meta-data
android:name="design_width_in_dp"
android:value="360" />

View File

@@ -12,7 +12,6 @@ import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.TextUtils;
@@ -24,13 +23,10 @@ import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.bumptech.glide.Glide;
import com.google.gson.Gson;
@@ -38,6 +34,7 @@ import com.google.gson.reflect.TypeToken;
import com.hjq.toast.Toaster;
import com.ttstd.elderlyassistant.BuildConfig;
import com.ttstd.elderlyassistant.R;
import com.ttstd.elderlyassistant.base.mvvm.BaseMvvmActivity;
import com.ttstd.elderlyassistant.bean.ContactInfo;
import com.ttstd.elderlyassistant.databinding.ActivityWriteMessageBinding;
import com.ttstd.elderlyassistant.gson.GsonUtils;
@@ -52,8 +49,7 @@ import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
public class WriteMessageActivity extends AppCompatActivity {
public class WriteMessageActivity extends BaseMvvmActivity<WriteMessageViewModel, ActivityWriteMessageBinding> {
private static final String TAG = "WriteMessageActivity";
private static final int REQUEST_PERMISSION_CODE = 1234;
private static final int REQUEST_CAMERA = 1111;
@@ -61,9 +57,6 @@ public class WriteMessageActivity extends AppCompatActivity {
private static final int REQUEST_CROP = 3333;
private ActivityWriteMessageBinding mBinding;
private WriteMessageViewModel mViewModel;
private Gson mGson = new Gson();
private NfcAdapter mNfcAdapter;
@@ -74,15 +67,20 @@ public class WriteMessageActivity extends AppCompatActivity {
private String mUploadImageUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_write_message);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_write_message);
mBinding.setLifecycleOwner(this);
mBinding.setClick(new BtnClick());
mViewModel = new ViewModelProvider(this).get(WriteMessageViewModel.class);
mBinding.setViewModel(mViewModel);
protected int getLayoutId() {
return R.layout.activity_write_message;
}
@Override
protected void initDataBinding() {
mViewModel.setContext(this);
mViewModel.setVDBinding(mViewDataBinding);
mViewModel.setLifecycle(getLifecycleSubject());
mViewDataBinding.setClick(new BtnClick());
}
@Override
protected void initView() {
Log.e(TAG, "onCreate: getDataDir = " + getDataDir().getAbsolutePath());
Log.e(TAG, "onCreate: getExternalFilesDir = " + getExternalFilesDir(null));
Log.e(TAG, "onCreate: getFilesDir = " + getFilesDir());
@@ -108,6 +106,11 @@ public class WriteMessageActivity extends AppCompatActivity {
});
}
@Override
protected void initData() {
}
@Override
protected void onStart() {
super.onStart();
@@ -157,7 +160,7 @@ public class WriteMessageActivity extends AppCompatActivity {
//2.获取Ndef的实例
Ndef ndef = Ndef.get(mTag);
String id = HexUtils.bytesToHexString(mTag.getId());
mBinding.tvId.setText("已连接: " + id);
mViewDataBinding.tvId.setText("已连接: " + id);
Log.e(TAG, "onNewIntent: id = " + id);
if (ndef != null) {
Log.e(TAG, "onNewIntent: type = " + ndef.getType());
@@ -201,7 +204,7 @@ public class WriteMessageActivity extends AppCompatActivity {
switch (path) {
case "/contactInfo":
mBinding.rbNoEncryption.setChecked(true);
mViewDataBinding.rbNoEncryption.setChecked(true);
try {
ContactInfo contactInfo = mGson.fromJson(detail, listType);
setContactInfo(contactInfo);
@@ -210,7 +213,7 @@ public class WriteMessageActivity extends AppCompatActivity {
}
break;
case "/encrypted":
mBinding.rbEncryption.setChecked(true);
mViewDataBinding.rbEncryption.setChecked(true);
try {
String trimString = detail.trim();
String decryptedString = AESUtil.decrypt(trimString);
@@ -236,11 +239,11 @@ public class WriteMessageActivity extends AppCompatActivity {
private void setContactInfo(ContactInfo contactInfo) {
mUploadImageUrl = contactInfo.getAvatar();
mBinding.setContactInfo(contactInfo);
mViewDataBinding.setContactInfo(contactInfo);
Glide.with(this)
.load(contactInfo.getAvatar())
.error(R.drawable.ic_default_avatar)
.into(mBinding.ivAvatar);
.into(mViewDataBinding.ivAvatar);
}
@Override
@@ -264,7 +267,7 @@ public class WriteMessageActivity extends AppCompatActivity {
} else if (requestCode == REQUEST_CROP) {
Bitmap bitmap = data.getParcelableExtra("data");
if (bitmap != null) {
mBinding.ivAvatar.setImageBitmap(bitmap);
mViewDataBinding.ivAvatar.setImageBitmap(bitmap);
File file = BitmapUtils.createImageFile(WriteMessageActivity.this, "crop_avatar_" + System.currentTimeMillis() + ".jpg");
BitmapUtils.saveBitmapToFile(bitmap, file);
mViewModel.uploadAvatar(file);
@@ -296,7 +299,7 @@ public class WriteMessageActivity extends AppCompatActivity {
ActivityCompat.requestPermissions(WriteMessageActivity.this, permissions, REQUEST_PERMISSION_CODE);
} else {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = new File(getExternalCacheDir(), "temp_avatar_" + System.currentTimeMillis() + ".jpg");
File photoFile = new File(FileUtils.getCacheDir(WriteMessageActivity.this), "temp_avatar_" + System.currentTimeMillis() + ".jpg");
imageUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".FileProvider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, REQUEST_CAMERA);
@@ -332,11 +335,11 @@ public class WriteMessageActivity extends AppCompatActivity {
Toaster.showLong("NFC卡片未连接");
return;
}
Editable nameEditable = mBinding.etName.getText();
Editable phoneEditable = mBinding.etPhone.getText();
Editable wxidEditable = mBinding.etWxid.getText();
Editable qqEditable = mBinding.etQq.getText();
Editable tagEditable = mBinding.etTag.getText();
Editable nameEditable = mViewDataBinding.etName.getText();
Editable phoneEditable = mViewDataBinding.etPhone.getText();
Editable wxidEditable = mViewDataBinding.etWxid.getText();
Editable qqEditable = mViewDataBinding.etQq.getText();
Editable tagEditable = mViewDataBinding.etTag.getText();
if (TextUtils.isEmpty(nameEditable)) {
Toaster.showLong("请输入姓名或昵称");
@@ -348,10 +351,10 @@ public class WriteMessageActivity extends AppCompatActivity {
String qq = qqEditable.toString();
String tag = tagEditable.toString();
int checkedId = mBinding.rgOperation.getCheckedRadioButtonId();
int checkedId = mViewDataBinding.rgOperation.getCheckedRadioButtonId();
if (checkedId != -1) {
View checkedView = mBinding.rgOperation.findViewById(checkedId);
int index = mBinding.rgOperation.indexOfChild(checkedView);
View checkedView = mViewDataBinding.rgOperation.findViewById(checkedId);
int index = mViewDataBinding.rgOperation.indexOfChild(checkedView);
Log.d("SelectedIndex", "位置: " + index); // 输出索引从0开始
mOperationId = index + 1;
} else {
@@ -369,7 +372,7 @@ public class WriteMessageActivity extends AppCompatActivity {
contactInfo.setAvatar(mUploadImageUrl);
if (mBinding.rbEncryption.isChecked()) {
if (mViewDataBinding.rbEncryption.isChecked()) {
try {
String jsonString = GsonUtils.toJSONString(contactInfo);
String encryptedString = AESUtil.encrypt(jsonString.trim());

View File

@@ -3,9 +3,12 @@ package com.ttstd.elderlyassistant.activity.write;
import android.util.Log;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.ttstd.elderlyassistant.base.mvvm.BaseViewModel;
import com.ttstd.elderlyassistant.bean.UploadImageResponse;
import com.ttstd.elderlyassistant.databinding.ActivityWriteMessageBinding;
import com.ttstd.elderlyassistant.network.NetInterfaceManager;
import java.io.File;
@@ -14,15 +17,14 @@ import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable;
public class WriteMessageViewModel extends ViewModel {
public class WriteMessageViewModel extends BaseViewModel<ActivityWriteMessageBinding, ActivityEvent> {
private static final String TAG = "WriteMessageViewModel";
public MutableLiveData<String> mUploadImageUrlData = new MutableLiveData<>();
public void uploadAvatar(File file) {
NetInterfaceManager.getInstance().getDevicesLockedStateObservable(file)
// .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<UploadImageResponse>() {
@Override
public void onSubscribe(@NonNull Disposable d) {

View File

@@ -0,0 +1,30 @@
package com.ttstd.elderlyassistant.annotations;
import android.content.Context;
import androidx.annotation.NonNull;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool;
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
super.applyOptions(context, builder);
//内存缓存
int memoryCacheSizeBytes = 1024 * 1024 * 32; // 20mb
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
//Bitmap 池
int bitmapPoolSizeBytes = 1024 * 1024 * 64; // 30mb
builder.setBitmapPool(new LruBitmapPool(bitmapPoolSizeBytes));
//磁盘缓存
int diskCacheSizeBytes = 1024 * 1024 * 128; // 100MB
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
}
}

View File

@@ -3,6 +3,7 @@ package com.ttstd.elderlyassistant.base;
import android.app.Application;
import android.util.Log;
import com.bumptech.glide.Glide;
import com.hjq.toast.Toaster;
import com.tencent.mmkv.MMKV;
import com.ttstd.elderlyassistant.network.NetInterfaceManager;
@@ -20,18 +21,20 @@ public class BaseApplication extends Application {
NetInterfaceManager.init(this);
}
@Override
public void onTerminate() {
super.onTerminate();
}
@Override
public void onLowMemory() {
super.onLowMemory();
Glide.get(this).onLowMemory();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
Glide.get(this).trimMemory(level);
}
@Override
public void onTerminate() {
super.onTerminate();
}
}

View File

@@ -0,0 +1,39 @@
package com.ttstd.elderlyassistant.base;
import com.ttstd.elderlyassistant.base.rx.BaseRxActivity;
import me.jessyan.autosize.AutoSizeCompat;
public abstract class BaseTransparentActivity extends BaseRxActivity {
/**
* 修补autozie RecyclerView item大小不一致
*/
@Override
protected void onResume() {
super.onResume();
AutoSizeCompat.autoConvertDensityOfGlobal(getResources());
}
/**
* 设置布局
*/
protected abstract int getLayoutId();
/**
* @return 是否是黑色状态栏
*/
// protected abstract boolean setNightMode();
public boolean setNightMode() {
return false;
}
/**
* @return 是否是入侵
*/
// protected abstract boolean setNightMode();
public boolean setfitWindow() {
return false;
}
}

View File

@@ -0,0 +1,56 @@
package com.ttstd.elderlyassistant.base.mvvm;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.ttstd.elderlyassistant.base.BaseTransparentActivity;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
public abstract class BaseMvvmActivity<VM extends ViewModel, VDB extends ViewDataBinding> extends BaseTransparentActivity {
private static final String TAG = BaseMvvmActivity.class.getSimpleName();
protected VM mViewModel;
protected VDB mViewDataBinding;
protected Class<VM> vmClass;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
mViewDataBinding.setLifecycleOwner(this);
vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
boolean isAbstract = Modifier.isAbstract(vmClass.getModifiers());
Log.e(TAG, "isLocalClass:" + vmClass.getSimpleName().equals(ViewModel.class.getSimpleName()) + " isAbstract:" + isAbstract);
if (!isAbstract) {//不是一个抽象类
mViewModel = new ViewModelProvider(this).get(vmClass);
}
initDataBinding();
initView();
initData();
}
protected abstract void initDataBinding();
/**
* 初始化视图
*/
protected abstract void initView();
/**
* 初始化数据
*/
protected abstract void initData();
}

View File

@@ -0,0 +1,54 @@
package com.ttstd.elderlyassistant.base.mvvm;
import android.content.Context;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.ViewModel;
import java.lang.ref.WeakReference;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
public abstract class BaseViewModel<VDB extends ViewDataBinding, T> extends ViewModel {
/**
* 当前viewmodel对应的页面binding
*/
protected VDB binding;
public void setVDBinding(ViewDataBinding vdBinding) {
binding = (VDB) vdBinding;
}
public VDB getVDBinding() {
if (binding == null) {
throw new NullPointerException("BaseViewModel >> getVDBinding >> null!!!");
}
return binding;
}
private WeakReference<Context> weakContext;
public void setContext(Context context) {
if (weakContext == null) {
weakContext = new WeakReference<>(context.getApplicationContext());
}
}
public Context getSafeContext() {
if (weakContext == null) {
throw new NullPointerException("BaseViewModel >> getCtx >> null!!!");
}
return weakContext.get();
}
private BehaviorSubject<T> mBehaviorSubject;
public void setLifecycle(BehaviorSubject subject) {
this.mBehaviorSubject = (BehaviorSubject<T>) subject;
}
public BehaviorSubject<T> getLifecycle() {
return mBehaviorSubject;
}
}

View File

@@ -0,0 +1,94 @@
package com.ttstd.elderlyassistant.base.rx;
import android.os.Bundle;
import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
/**
* {@link com.trello.rxlifecycle4.components.RxActivity}
* copied form RxActivity}
*/
public abstract class BaseRxActivity extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
public BehaviorSubject<ActivityEvent> getLifecycleSubject() {
return lifecycleSubject;
}
@Override
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(ActivityEvent.CREATE);
}
@Override
@CallSuper
protected void onStart() {
super.onStart();
lifecycleSubject.onNext(ActivityEvent.START);
}
@Override
@CallSuper
protected void onResume() {
super.onResume();
lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@Override
@CallSuper
protected void onPause() {
lifecycleSubject.onNext(ActivityEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
protected void onStop() {
lifecycleSubject.onNext(ActivityEvent.STOP);
super.onStop();
}
@Override
@CallSuper
protected void onDestroy() {
lifecycleSubject.onNext(ActivityEvent.DESTROY);
super.onDestroy();
}
}

View File

@@ -0,0 +1,123 @@
package com.ttstd.elderlyassistant.base.rx;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.FragmentEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
/**
* {@link com.trello.rxlifecycle4.components.RxFragment}
* copied form RxFragment}
*/
public class BaseRxFragment extends Fragment implements LifecycleProvider<FragmentEvent> {
private final BehaviorSubject<FragmentEvent> lifecycleSubject = BehaviorSubject.create();
public BehaviorSubject<FragmentEvent> getLifecycleSubject() {
return lifecycleSubject;
}
@Override
@NonNull
@CheckResult
public final Observable<FragmentEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull FragmentEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindFragment(lifecycleSubject);
}
@Override
@CallSuper
public void onAttach(android.app.Activity activity) {
super.onAttach(activity);
lifecycleSubject.onNext(FragmentEvent.ATTACH);
}
@Override
@CallSuper
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(FragmentEvent.CREATE);
}
@Override
@CallSuper
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW);
}
@Override
@CallSuper
public void onStart() {
super.onStart();
lifecycleSubject.onNext(FragmentEvent.START);
}
@Override
@CallSuper
public void onResume() {
super.onResume();
lifecycleSubject.onNext(FragmentEvent.RESUME);
}
@Override
@CallSuper
public void onPause() {
lifecycleSubject.onNext(FragmentEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
public void onStop() {
lifecycleSubject.onNext(FragmentEvent.STOP);
super.onStop();
}
@Override
@CallSuper
public void onDestroyView() {
lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW);
super.onDestroyView();
}
@Override
@CallSuper
public void onDestroy() {
lifecycleSubject.onNext(FragmentEvent.DESTROY);
super.onDestroy();
}
@Override
@CallSuper
public void onDetach() {
lifecycleSubject.onNext(FragmentEvent.DETACH);
super.onDetach();
}
}

View File

@@ -0,0 +1,62 @@
package com.ttstd.elderlyassistant.base.rx;
import android.app.Service;
import android.content.Intent;
import androidx.annotation.CheckResult;
import androidx.annotation.NonNull;
import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
public abstract class BaseRxService extends Service implements LifecycleProvider<ActivityEvent> {
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
public BehaviorSubject<ActivityEvent> getLifecycleSubject() {
return lifecycleSubject;
}
@Override
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
@Override
public void onCreate() {
super.onCreate();
lifecycleSubject.onNext(ActivityEvent.CREATE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
lifecycleSubject.onNext(ActivityEvent.STOP);
}
}

View File

@@ -7,6 +7,7 @@ import android.util.Log;
import com.ttstd.elderlyassistant.bean.UploadImageResponse;
import com.ttstd.elderlyassistant.network.api.UploadPictrueApi;
import com.ttstd.elderlyassistant.network.interceptor.RepeatRequestInterceptor;
import com.ttstd.elderlyassistant.utils.FileUtils;
import org.jetbrains.annotations.NotNull;
@@ -64,8 +65,8 @@ public class NetInterfaceManager {
builder.dispatcher(dispatcher);
builder.connectionPool(new ConnectionPool(20, 1, TimeUnit.SECONDS));
// 设置缓存文件路径
String cacheDirectory = mContext.getExternalCacheDir().getAbsolutePath() + "/OkHttpCache";
Cache cache = new Cache(new File(cacheDirectory), CACHE_SIZE);
File cacheDirectory = new File(FileUtils.getCacheDir(mContext), "OkHttpCache");
Cache cache = new Cache(cacheDirectory, CACHE_SIZE);
builder.cache(cache);// 设置缓存
mOkHttpClient = builder.build();
@@ -95,8 +96,8 @@ public class NetInterfaceManager {
}
}).setLevel(HttpLoggingInterceptor.Level.BASIC));
// 设置缓存文件路径
String cacheDirectory = mContext.getExternalCacheDir().getAbsolutePath() + "/OkHttpCache";
Cache cache = new Cache(new File(cacheDirectory), CACHE_SIZE);
File cacheDirectory = new File(FileUtils.getCacheDir(mContext), "OkHttpCache");
Cache cache = new Cache(cacheDirectory, CACHE_SIZE);
builder.cache(cache);// 设置缓存
mScdnClient = builder.build();
}

View File

@@ -5,6 +5,7 @@ import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Log;
@@ -16,6 +17,25 @@ import java.io.InputStream;
import java.io.OutputStream;
public class FileUtils {
private static final String TAG = "FileUtils";
public static String getCacheDir(Context context) {
String cachePath;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
if (context.getExternalCacheDir() != null) {
cachePath = context.getExternalCacheDir().getPath();
} else if (context.getExternalFilesDir("cache") != null) {
cachePath = context.getExternalFilesDir("cache").getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
} else {
cachePath = context.getCacheDir().getPath();
}
Log.e(TAG, "getCacheDir: " + cachePath);
return cachePath;
}
public static File uriToFile(Context context, Uri uri) throws IOException {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {