app/src/main/AndroidManifest.xml
@@ -158,6 +158,15 @@ android:name=".activity.ReminderSettingsActivity" android:exported="false" android:label="设置提醒" /> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application> </manifest> app/src/main/java/com/example/firstapp/database/service/ApiService.kt
@@ -14,6 +14,8 @@ import com.example.firstapp.database.response.LoginResponse import com.example.firstapp.database.response.SecurityResponse import com.example.firstapp.database.response.UserInfo import com.example.firstapp.entity.InvitationRecord import com.example.firstapp.entity.InvitationRecords import com.example.firstapp.model.CategoryConfig import com.example.firstapp.model.CategoryConfigSync import com.example.firstapp.network.AuthInterceptor @@ -81,13 +83,16 @@ @POST("api/categoryConfig/saveOrUpdate/") suspend fun saveUserCategories(@Body categoryConfigSync: CategoryConfigSync) @GET("api/customer/center/invitereward") suspend fun getInvitereward(): ApiResponse<InvitationRecords> } // 创建Retrofit实例(单例) object RetrofitClient{ // private const val BASE_URL ="http://192.168.1.213:8080/flower/" private const val BASE_URL ="http://14.103.144.28:8080/flower/" private const val BASE_URL ="http://192.168.1.127:8080/flower/" //private const val BASE_URL ="http://14.103.144.28:8080/flower/" private lateinit var appContext: Context app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
@@ -1,7 +1,13 @@ package com.example.firstapp.entity data class InvitationRecord( val userId: String, val userName: String, val reward: String, val status: String ) data class InvitationRecords( val successInvite: List<InvitationRecord>, val myInvite: List<InvitationRecord> ) app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
@@ -1,9 +1,14 @@ package com.example.firstapp.ui.invitation import android.app.Dialog import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.Color import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Bundle import android.os.Handler @@ -11,18 +16,32 @@ import android.text.Html import android.util.TypedValue import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.ImageView import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView import com.example.firstapp.App.Companion.context import com.example.firstapp.R import com.example.firstapp.adapter.InvitationAdapter import com.example.firstapp.adapter.InvitationRecordAdapter import com.example.firstapp.database.request.SmsLoginRequest import com.example.firstapp.database.service.RetrofitClient import com.example.firstapp.entity.InvitationRecord import com.example.firstapp.utils.Log import com.example.firstapp.utils.PreferencesManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File import java.io.FileOutputStream import kotlin.math.abs class InvitationActivity : AppCompatActivity() { @@ -31,8 +50,8 @@ private lateinit var recyclerRecordView: RecyclerView private lateinit var adapter: InvitationAdapter private lateinit var recordadapter: InvitationRecordAdapter private val data = mutableListOf<InvitationRecord>() private val recorddata = mutableListOf<InvitationRecord>() private var data = mutableListOf<InvitationRecord>() private var recorddata = mutableListOf<InvitationRecord>() private val handler = Handler(Looper.getMainLooper()) private val scrollInterval = 3000L private var currentScrollPosition = 0 @@ -52,9 +71,10 @@ initRecorddapter() //加载数据 loadData() getInvitereward() //loadData() loadRecordData() //loadRecordData() //启动轮播 startAutoScroll() @@ -62,13 +82,13 @@ //分享 val btnInvite = findViewById<Button>(R.id.btnInvite) btnInvite.setOnClickListener { shareImageToWechat() showImagePreviewDialog() } //邀请码 val invitationCodeText = findViewById<TextView>(R.id.invitationCodeText) invitationCodeText.text = "A1B2" //invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode()); //invitationCodeText.text = "A1B2" invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode()); findViewById<Button>(R.id.copyButton).setOnClickListener { val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText( @@ -207,52 +227,132 @@ recyclerRecordView.adapter = recordadapter } private fun loadData() { data.clear() data.addAll( listOf( InvitationRecord("H****e", "获得了1天会员", "已注册"), InvitationRecord("U****r", "获得了2天会员", "已注册"), InvitationRecord("A****e", "获得了免广告特权", "已注册"), InvitationRecord("B****e", "获得了3天会员", "已注册"), InvitationRecord("C****o", "获得了4天会员", "已注册") ) ) adapter.notifyDataSetChanged() private fun getInvitereward() { lifecycleScope.launch { try { val response = RetrofitClient.apiService.getInvitereward() if (response.code == "0") { response.data?.let { records -> // 正确更新现有列表(保持原有引用) data.apply { clear() addAll(records.successInvite ?: emptyList()) } recorddata.apply { clear() addAll(records.myInvite ?: emptyList()) // 注意这里使用myInvite } // 在UI线程更新适配器 withContext(Dispatchers.Main) { adapter.notifyDataSetChanged() recordadapter.notifyDataSetChanged() } } ?: run { Log.w("API", "Response data is null") } } else { Log.w("API", "Server error: ${response.msg}") } } catch (e: Exception) { Log.e("getinviterewardError", "message: ${e.message}", e) withContext(Dispatchers.Main) { Toast.makeText(context, "请求失败: ${e.message}", Toast.LENGTH_SHORT).show() } } } } private fun loadRecordData() { recorddata.clear() recorddata.addAll( listOf( InvitationRecord("M****e", "", "未注册"), InvitationRecord("Q****r", "", "已注册"), InvitationRecord("W****e", "", "未注册"), InvitationRecord("E****e", "", "未注册"), InvitationRecord("R****o", "", "已注册") ) ) recordadapter.notifyDataSetChanged() // private fun loadData() { // data.clear() // data.addAll( // listOf( // InvitationRecord("H****e", "获得了1天会员", "已注册"), // InvitationRecord("U****r", "获得了2天会员", "已注册"), // InvitationRecord("A****e", "获得了免广告特权", "已注册"), // InvitationRecord("B****e", "获得了3天会员", "已注册"), // InvitationRecord("C****o", "获得了4天会员", "已注册") // ) // ) // adapter.notifyDataSetChanged() // } // private fun loadRecordData() { // recorddata.clear() // recorddata.addAll( // listOf( // InvitationRecord("M****e", "", "未注册"), // InvitationRecord("Q****r", "", "已注册"), // InvitationRecord("W****e", "", "未注册"), // InvitationRecord("E****e", "", "未注册"), // InvitationRecord("R****o", "", "已注册") // ) // ) // recordadapter.notifyDataSetChanged() // } private fun showImagePreviewDialog() { val dialog = Dialog(this, android.R.style.Theme_Translucent_NoTitleBar).apply { // 设置全屏+透明背景 window?.apply { setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) } setContentView(R.layout.dialog_image_preview) setCancelable(true) // 点击空白处可关闭 val imageView = findViewById<ImageView>(R.id.ivPreview) // 长按分享(不关闭对话框) imageView.setOnLongClickListener { shareImageToWechat() true } // 点击图片关闭(可选) imageView.setOnClickListener { dismiss() } } dialog.show() } // 分享资源图片到微信 private fun shareImageToWechat() { try { // 获取资源图片的URI val imageUri = Uri.parse("android.resource://${packageName}/${R.drawable.location}") // 1. 将 drawable 图片保存到缓存目录 val drawable = ContextCompat.getDrawable(this, R.drawable.invite)!! val bitmap = (drawable as BitmapDrawable).bitmap // 2. 创建临时图片文件 val cacheDir = File(cacheDir, "shared_images").apply { mkdirs() } val imageFile = File(cacheDir, "invite.jpg") // 指定文件名 FileOutputStream(imageFile).use { out -> bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out) } // 3. 使用 FileProvider 获取 URI val imageUri = FileProvider.getUriForFile( this, "${packageName}.fileprovider", imageFile ) // 4. 创建分享 Intent val intent = Intent().apply { action = Intent.ACTION_SEND type = "image/*" type = "image/jpeg" putExtra(Intent.EXTRA_STREAM, imageUri) flags = Intent.FLAG_GRANT_READ_URI_PERMISSION setPackage("com.tencent.mm") // 指定微信包名 } // 创建选择器,即使微信不可用也能选择其他应用 // 5. 启动分享选择器 val chooserIntent = Intent.createChooser(intent, "分享邀请图片") // 检查是否有应用能处理这个Intent if (intent.resolveActivity(packageManager) != null) { startActivity(chooserIntent) } else { @@ -264,8 +364,8 @@ } private fun formatInvitationCode(code: String): String { return if (code.length > 2) { code.chunked(2).joinToString(" ") return if (code.length > 1) { code.chunked(1).joinToString(" ") } else { code } @@ -280,7 +380,7 @@ // 使用取模运算确保位置在有效范围内 currentScrollPosition++ currentRecordScrollPosition++ //currentRecordScrollPosition++ // 创建自定义平滑滚动器 val smoothScroller = object : LinearSmoothScroller(this@InvitationActivity) { @@ -305,32 +405,32 @@ targetPosition = currentScrollPosition } val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) { override fun getVerticalSnapPreference(): Int = SNAP_TO_START override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int { // 计算需要滚动的距离,确保完整显示下一个item val top = view.top val height = view.height return when { snapPreference == SNAP_TO_START -> -top snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height)) else -> -(top - (recyclerRecordView.height / 2 - height / 2)) } } override fun calculateTimeForScrolling(dx: Int): Int { // 根据滚动距离动态计算时间,保持匀速 return maxOf((500f * abs(dx) / itemHeight).toInt(), 200) } }.apply { targetPosition = currentRecordScrollPosition } // val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) { // override fun getVerticalSnapPreference(): Int = SNAP_TO_START // // override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int { // // 计算需要滚动的距离,确保完整显示下一个item // val top = view.top // val height = view.height // return when { // snapPreference == SNAP_TO_START -> -top // snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height)) // else -> -(top - (recyclerRecordView.height / 2 - height / 2)) // } // } // // override fun calculateTimeForScrolling(dx: Int): Int { // // 根据滚动距离动态计算时间,保持匀速 // return maxOf((500f * abs(dx) / itemHeight).toInt(), 200) // } // }.apply { // targetPosition = currentRecordScrollPosition // } // 启动平滑滚动 recyclerSuccessView.layoutManager?.startSmoothScroll(smoothScroller) recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller) //recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller) // 更智能的边界检测 (recyclerSuccessView.layoutManager as? LinearLayoutManager)?.let { lm -> @@ -345,24 +445,20 @@ } } (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm -> val lastVisible = lm.findLastVisibleItemPosition() val totalItems = recordadapter.itemCount // 当接近"虚拟列表"末尾时,跳转到中间位置 if (lastVisible >= totalItems - 3) { val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems) currentRecordScrollPosition = jumpPosition recyclerRecordView.scrollToPosition(jumpPosition) } } // (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm -> // val lastVisible = lm.findLastVisibleItemPosition() // val totalItems = recordadapter.itemCount // // // 当接近"虚拟列表"末尾时,跳转到中间位置 // if (lastVisible >= totalItems - 3) { // val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems) // currentRecordScrollPosition = jumpPosition // recyclerRecordView.scrollToPosition(jumpPosition) // } // } handler.postDelayed(this, scrollInterval) } } private fun pxToDp(px: Int, context: Context): Int { return (px / (context.resources.displayMetrics.density)).toInt() } private fun dpToPx(dp: Float): Int { app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
@@ -327,7 +327,7 @@ val userInfo = response.data // 本地保存我的邀请码 // PreferencesManager.setInviteCode(userInfo.intervialcode); PreferencesManager.setInviteCode(userInfo.intervialcode); // 设置头像 Glide.with(this) .load(userInfo.cover) app/src/main/res/drawable/invite.png
app/src/main/res/drawable/table_border.xml
@@ -1,7 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <stroke android:width="1dp" android:color="#CCCCCC" /> <solid android:color="#FFFFFF" /> <stroke android:width="1dp" android:color="#DDDDDD"/> <corners android:radius="4dp"/> </shape> app/src/main/res/drawable/table_cell_border.xml
对比新文件 @@ -0,0 +1,4 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android"> <stroke android:width="0.5dp" android:color="#DDDDDD"/> <padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp"/> </shape> app/src/main/res/layout/activity_invitation_main.xml
@@ -63,7 +63,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dp" app:cardCornerRadius="18dp"> app:cardCornerRadius="38dp"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/invitationsuccessRecyclerView" @@ -93,39 +93,40 @@ android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginBottom="8dp" app:cardBackgroundColor="#FFFFFF" app:cardCornerRadius="8dp" app:cardPreventCornerOverlap="true" app:cardElevation="0dp" app:cardBackgroundColor="#FFFFFF"> app:cardPreventCornerOverlap="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" android:paddingStart="16dp" android:paddingEnd="16dp" android:gravity="center_vertical"> android:paddingEnd="16dp"> <TextView android:id="@+id/invitationCodeText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="A1B2" android:textAlignment="center" android:textColor="#000000" android:textSize="30sp" /> <Button android:id="@+id/copyButton" style="?android:attr/borderlessButtonStyle" android:layout_width="wrap_content" android:layout_height="40dp" android:text="复制邀请码" android:textColor="#FF0000" android:backgroundTint="#FFFFFF" android:textSize="12sp" android:background="@android:color/transparent" android:paddingStart="12dp" android:paddingEnd="12dp"/> android:paddingEnd="12dp" android:stateListAnimator="@null" android:text="复制邀请码" android:textColor="#FF0000FF" android:textSize="13sp" /> </LinearLayout> </androidx.cardview.widget.CardView> @@ -137,136 +138,155 @@ app:cardCornerRadius="6dp" app:cardPreventCornerOverlap="true"> <TableLayout android:id="@+id/tableLayout" <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/table_border" android:shrinkColumns="*" android:stretchColumns="*"> android:orientation="vertical"> <TableRow> <!-- 添加"邀请任务"标题 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingBottom="8dp" android:text="邀请任务" android:textColor="#333333" android:textSize="16sp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="邀请人数" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <!-- 表格区域 --> <TableLayout android:id="@+id/tableLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/table_border" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingBottom="16dp" android:shrinkColumns="*" android:stretchColumns="*"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="邀请奖励" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TableRow android:background="@drawable/table_cell_border"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="被邀请人奖励" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="邀请人数" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="邀请奖励" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="1人" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="被邀请人奖励" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="3天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TableRow android:background="@drawable/table_cell_border"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="1天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="1人" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="3天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="3人" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="1天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="15天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TableRow android:background="@drawable/table_cell_border"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="1天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="3人" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="15天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="5人" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="1天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="30天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TableRow android:background="@drawable/table_cell_border"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="6dp" android:text="1天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> </TableLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="5人" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="30天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/table_cell_border" android:text="1天会员" android:textAlignment="center" android:textColor="#333333" android:textSize="12sp" /> </TableRow> </TableLayout> </LinearLayout> </androidx.cardview.widget.CardView> <!-- 邀请记录区域 --> @@ -276,12 +296,31 @@ android:layout_marginBottom="20dp" app:cardCornerRadius="6dp" app:cardPreventCornerOverlap="true"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/invitationrecordRecyclerView" <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:nestedScrollingEnabled="false" android:overScrollMode="never" /> android:orientation="vertical"> <!-- 添加"我的邀请记录"标题 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingBottom="8dp" android:text="我的邀请记录" android:textColor="#333333" android:textSize="16sp" android:textStyle="bold" android:gravity="center" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/invitationrecordRecyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" android:nestedScrollingEnabled="false" android:overScrollMode="never" /> </LinearLayout> </androidx.cardview.widget.CardView> <!-- 添加一个权重为1的View,用于填充剩余空间 --> app/src/main/res/layout/dialog_image_preview.xml
对比新文件 @@ -0,0 +1,24 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#80000000"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" android:padding="16dp"> <ImageView android:id="@+id/ivPreview" android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:maxWidth="1000dp" android:maxHeight="1000dp" android:scaleType="fitCenter" android:src="@drawable/invite" /> </LinearLayout> </FrameLayout> app/src/main/res/xml/file_paths.xml
对比新文件 @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <paths> <!-- 缓存目录 --> <cache-path name="shared_images" path="shared_images/" /> </paths> app/src/main/res/xml/network_security_config.xml
@@ -7,6 +7,7 @@ <domain includeSubdomains="true">192.168.1.199</domain> <domain includeSubdomains="true">192.168.1.201</domain> <domain includeSubdomains="true">14.103.144.28</domain> <domain includeSubdomains="true">192.168.1.127</domain> <!-- 可添加其他域名或IP(如192.168.0.101) --> <!-- 如果本地服务使用自签名证书,需在 network_security_config.xml 中信任该证书:--> <!-- <trust-anchors>-->