/* 文件路径: MyAppFunction.java */
package com.example.kucun2.function;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.StringRes;
import com.example.kucun2.DataPreserver.Data;
import com.example.kucun2.MainActivity;
import java.lang.reflect.Field;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
public class MyAppFunction extends Application {
private static MyAppFunction instance;
private String TAG ="MyAppFnction";
public static OkHttpClient getClient() {
return client;
}
private static OkHttpClient client;
public static String getApiUrl(String s) {
return getStringResource("string","url")+getStringResource("string",s);
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
createSecureClient(this.getApplicationContext());
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
private int activityCount = 0;
@Override
public void onActivityCreated(android.app.Activity activity, Bundle savedInstanceState) {}
@Override
public void onActivityStarted(android.app.Activity activity) {
activityCount++;
}
@Override
public void onActivityResumed(android.app.Activity activity) {}
@Override
public void onActivityPaused(android.app.Activity activity) {}
@Override
public void onActivityStopped(android.app.Activity activity) {
activityCount--;
// 当所有Activity都停止时(应用进入后台)
if (activityCount == 0) {
saveData();
}
}
@Override
public void onActivitySaveInstanceState(android.app.Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed(android.app.Activity activity) {
// Activity销毁时保存数据
if (activity instanceof MainActivity && activity.isFinishing()) {
saveData();
}
}
});
}
private void saveData() {
try {
Log.d(TAG, "Saving application data...");
Data.saveAllData(this);
} catch (Exception e) {
Log.e(TAG, "Failed to save application data", e);
}
}
public static String getStringResource(@StringRes int resId) {
return instance.getString(resId);
}
public static String getStringResource(@StringRes int resId, Object... args) {
return instance.getString(resId, args);
}
public static String getStringResource(String resourceType, String resourceName) {
try {
// 1. 构造完整的资源路径
String className = instance.getPackageName() + ".R$" + resourceType;
// 2. 反射获取资源ID
Class<?> resClass = Class.forName(className);
Field field = resClass.getField(resourceName);
int resId = field.getInt(null); // 静态字段获取资源ID
// 3. 获取实际字符串资源
return instance.getResources().getString(resId);
} catch (Exception e) {
handleError(e);
return null; // 或返回默认值
}
}
private static void handleError(Exception e) {
// 异常处理逻辑
if (e instanceof ClassNotFoundException) {
System.err.println("R类未找到: " + e.getMessage());
} else if (e instanceof NoSuchFieldException) {
System.err.println("资源字段不存在: " + e.getMessage());
} else {
e.printStackTrace();
}
}
public static void createSecureClient(Context context) {
// 创建安全的SSL上下文
SSLContext sslContext = TLSUtils.createSSLContext(context, "selfsigned.crt");
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
X509TrustManager trustManager = TLSUtils.createTrustManager(context, "selfsigned.crt");
client = new OkHttpClient.Builder()
.sslSocketFactory(socketFactory, trustManager)
.hostnameVerifier((hostname, session) -> {
// 开发环境直接返回true,生产环境应验证域名
return true;
})
.build();
}
}
================================================================================
/* 文件路径: TLSUtils.java */
package com.example.kucun2.function;
import android.content.Context;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.util.Arrays;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class TLSUtils {
private static final String TAG = "TLSUtils";
/**
* 创建信任自签名证书的SSL上下文
*/
public static SSLContext createSSLContext(Context context, String fileName) {
try {
X509TrustManager trustManager = createTrustManager(context, fileName);
return createSSLContext(trustManager);
} catch (Exception e) {
Log.e(TAG, "创建SSL上下文失败", e);
return null;
}
}
/**
* 使用信任管理器创建SSL上下文
*/
public static SSLContext createSSLContext(X509TrustManager trustManager)
throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{trustManager}, null);
return sslContext;
}
/**
* 创建信任管理器
*/
public static X509TrustManager createTrustManager(Context context, String fileName) {
try {
// 加载证书
Certificate certificate = loadCertificate(context, fileName);
// 创建包含证书的KeyStore
KeyStore keyStore = createKeyStoreWithCertificate(certificate);
// 初始化信任管理器工厂
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
// 查找X509TrustManager
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
return (X509TrustManager) tm;
}
}
throw new RuntimeException("未找到X509TrustManager");
} catch (Exception e) {
Log.e(TAG, "创建信任管理器失败", e);
return getSystemDefaultTrustManager(); // 回退到系统默认
}
}
/**
* 获取系统默认信任管理器
*/
private static X509TrustManager getSystemDefaultTrustManager() {
try {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null); // 初始化系统默认信任库
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
return (X509TrustManager) tm;
}
}
} catch (Exception e) {
Log.e(TAG, "获取系统默认信任管理器失败", e);
}
return null;
}
/**
* 从assets加载证书
*/
private static Certificate loadCertificate(Context context, String fileName)
throws CertificateException, IOException {
try (InputStream is = context.getAssets().open(fileName)) {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
return cf.generateCertificate(is);
}
}
/**
* 创建包含证书的KeyStore
*/
private static KeyStore createKeyStoreWithCertificate(Certificate certificate)
throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null); // 创建空KeyStore
keyStore.setCertificateEntry("selfsigned", certificate);
return keyStore;
}
}简化两个类,