ChipsLayoutManager/build.gradle
@@ -1,5 +1,5 @@ plugins { id "com.jfrog.bintray" version "1.7.3" // id "com.jfrog.bintray" version "1.7.3" id "com.github.dcendents.android-maven" version "1.5" } @@ -149,45 +149,45 @@ } } Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) bintray { user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") configurations = ['archives'] //When uploading configuration files dryRun = false //[Default: false] Whether to run this as dry-run, without deploying publish = true //[Default: false] Whether version should be auto published after an upload override = true //[Default: false] Whether to override version artifacts already published //Package configuration. The plugin will use the repo and name properties to check if the package already exists. In that case, there's no need to configure the other package properties (like userOrg, desc, etc). pkg { repo = bintrayRepo name = bintrayName desc = libraryDescription websiteUrl = siteUrl issueTrackerUrl = 'https://github.com/BelooS/ChipsLayoutManager/issues' vcsUrl = gitUrl licenses = allLicenses publish = true publicDownloadNumbers = true githubRepo = 'BelooS/ChipsLayoutManager' githubReleaseNotesFile = 'README.md' //Optional version descriptor version { name = libraryVersion //Bintray logical version name desc = '' //Optional - Version-specific description' vcsTag = libraryVersion gpg { sign = true //Determines whether to GPG sign the files. The default is false passphrase = properties.getProperty("bintray.gpg.password") //Optional. The passphrase for GPG signing' } } } } //Properties properties = new Properties() //properties.load(project.rootProject.file('local.properties').newDataInputStream()) // //bintray { // user = properties.getProperty("bintray.user") // key = properties.getProperty("bintray.apikey") // // configurations = ['archives'] //When uploading configuration files // // dryRun = false //[Default: false] Whether to run this as dry-run, without deploying // publish = true //[Default: false] Whether version should be auto published after an upload // override = true //[Default: false] Whether to override version artifacts already published // // //Package configuration. The plugin will use the repo and name properties to check if the package already exists. In that case, there's no need to configure the other package properties (like userOrg, desc, etc). // pkg { // repo = bintrayRepo // name = bintrayName // desc = libraryDescription // websiteUrl = siteUrl // issueTrackerUrl = 'https://github.com/BelooS/ChipsLayoutManager/issues' // vcsUrl = gitUrl // licenses = allLicenses // publish = true // publicDownloadNumbers = true // // githubRepo = 'BelooS/ChipsLayoutManager' // githubReleaseNotesFile = 'README.md' // // //Optional version descriptor // version { // name = libraryVersion //Bintray logical version name // desc = '' //Optional - Version-specific description' // vcsTag = libraryVersion // // gpg { // sign = true //Determines whether to GPG sign the files. The default is false // passphrase = properties.getProperty("bintray.gpg.password") // //Optional. The passphrase for GPG signing' // } // } // } //} app/build.gradle
@@ -24,8 +24,8 @@ applicationId "com.ziang.driver" minSdkVersion 26 targetSdkVersion 30 versionCode 24 versionName "2.9" versionCode 27 versionName "3.2" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } app/proguard-rules.pro
@@ -133,3 +133,6 @@ -dontwarn com.google.** -keep class com.google.gson.** {*;} -keep class com.google.protobuf.** {*;} -dontwarn com.tencent.bugly.** -keep public class com.tencent.bugly.**{*;} app/src/main/java/com/ziang/driver/base/BaseEvent.java
@@ -55,6 +55,9 @@ public static final int APP_BACKGROUND = 10033; // App置于后台 public static final int APP_LOG= 10099; // 日志 public static final int ORDER_GRAB_EVENT= 10100; // 订单被抢,关闭强单页 public static final int GET_SMALL_ORDER= 10101; // 获取到推送的小程序订单显示在前台 private String msg; private int code; @@ -111,6 +114,19 @@ this.typeTwo = typeTwo; } public BaseEvent(int code, int type, int typeTwo,String msg) { this.code = code; this.type = type; this.typeTwo = typeTwo; this.msg = msg; } public BaseEvent(int code, int type, String msg) { this.code = code; this.type = type; this.msg = msg; } public BaseEvent(int code, String msg, String msgTwo, String msgthree) { this.msg = msg; this.code = code; app/src/main/java/com/ziang/driver/base/BaseRecyclerFragment.kt
@@ -24,6 +24,7 @@ * Desc: 列表fragment */ abstract class BaseRecyclerFragment<Item>(var adapter: BaseRvAdapter<Item>) : MyBaseFragment() { var showQuan = true protected var page = 1 protected var pageSize = 20 protected var isShowNothingLayout = true @@ -191,12 +192,11 @@ } fun callRefresh() { val map = mapObject() map?.set("size",10) map?.set("pageNum",page) callNet(pathUrl()!!,map!!,{ callNet(showQuan,pathUrl()!!,map!!,{ if (it == null || it.isEmpty()) { return@callNet } app/src/main/java/com/ziang/driver/base/BaseViewHolder.java
@@ -1,5 +1,6 @@ package com.ziang.driver.base; import android.os.CountDownTimer; import android.view.View; import androidx.annotation.NonNull; @@ -12,8 +13,10 @@ */ public class BaseViewHolder extends RecyclerView.ViewHolder { public CountDownTimer mDownTimer = null; public BaseViewHolder(@NonNull View itemView) { super(itemView); } } app/src/main/java/com/ziang/driver/base/Const.java
@@ -58,6 +58,7 @@ public final static String REASSIGN = "REASSIGN"; public final static String OFFLINE = "OFFLINE"; public final static String EXPIRE_WORK = "EXPIRE_WORK"; public final static String ORDER_GRAB = "ORDER_GRAB"; } public static String REFUSE_LOCATION = "REFUSE_LOCATION"; app/src/main/java/com/ziang/driver/base/MyApplication.kt
@@ -10,29 +10,30 @@ import cn.sinata.xldutils.BaseApplication import cn.sinata.xldutils.utils.sysErr import com.amap.api.location.AMapLocation import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.tencent.bugly.crashreport.CrashReport import com.umeng.commonsdk.UMConfigure import com.umeng.socialize.PlatformConfig import com.xuexiang.xui.XUI import com.ziang.driver.base.gaode.gpsnav.util.TTSController import com.ziang.driver.bean.CarLocationBean import com.ziang.driver.bean.OrderResData import com.ziang.driver.bean.OrderSimpleData import com.ziang.driver.bean.websocket.HeartBean import com.ziang.driver.netUtls.Api import com.ziang.driver.netUtls.getUserId import com.ziang.driver.ui.pub.LoginActivity import com.ziang.driver.utils.Cache.CacheKey import com.ziang.driver.utils.Cache.CacheUtil import com.ziang.driver.utils.LogUtils import com.google.gson.Gson import com.tencent.bugly.crashreport.CrashReport import com.umeng.commonsdk.UMConfigure import com.umeng.socialize.PlatformConfig import com.xuexiang.xui.XUI import com.ziang.driver.netUtls.callNet import com.ziang.driver.netUtls.getMapByAny import com.ziang.driver.netUtls.getUserId import com.ziang.driver.ui.main.GetOrderFragment import com.ziang.driver.ui.main.VoiceOrderFragment import com.ziang.driver.ui.pub.LoginActivity import com.ziang.driver.utils.Cache.CacheUtil import com.ziang.driver.utils.LogUtils import org.greenrobot.eventbus.EventBus import org.jetbrains.anko.toast import org.json.JSONObject import java.lang.reflect.Type import java.security.SecureRandom import java.security.cert.X509Certificate import java.util.* @@ -63,7 +64,7 @@ XUI.init(this) registerActivityLifecycleCallbacks(this) initSocket() CrashReport.initCrashReport(this, "3685c4860a", true) CrashReport.initCrashReport(this, "06c8612c1a", true) } fun initPersionDate(){ @@ -116,6 +117,10 @@ Const.SOCKET_METHOD.EXPIRE_WORK -> { EventBus.getDefault().post(BaseEvent(BaseEvent.CHANGE_CAR_SUCCESS)) } Const.SOCKET_METHOD.ORDER_GRAB -> { var dataBean = Gson().fromJson(data,OrderSimpleData::class.java) EventBus.getDefault().post(BaseEvent(BaseEvent.ORDER_GRAB_EVENT,dataBean.orderId.toString())) } Const.SOCKET_METHOD.ORDER_STATUS -> { val orderSimpleData = Gson().fromJson( @@ -135,6 +140,7 @@ when (orderSimpleData.orderType) { 1,2 -> { if (!orderSimpleData.audioLinkUrl.isNullOrEmpty()){ Log.e("走正常声音单","订单id为"+orderSimpleData.orderId) EventBus.getDefault().post(BaseEvent(BaseEvent.APP_LOG,"当前无订单弹窗,显示此订单:id-${orderSimpleData.orderId},语音路径:${orderSimpleData.audioLinkUrl}")) voiceOrder = orderSimpleData (act as MyBaseActivity).showOrder( @@ -145,19 +151,22 @@ orderSimpleData.audioLinkUrl ) } else{ //小程序订单 var map = getMapByAny() map["orderId"] = orderSimpleData.orderId.toString() map["orderType"] = orderSimpleData.orderType.toString() map["lat"] = getLocation().latitude map["lon"] = getLocation().longitude callNet(this, Api.queryPushOrder, map) { (act as MyBaseActivity).showOrderWithData( orderSimpleData.orderId.toString(), orderSimpleData.orderType.toString(), orderSimpleData.time, 1, it ) EventBus.getDefault().post(BaseEvent(BaseEvent.GET_SMALL_ORDER ,orderSimpleData.orderType,orderSimpleData.time,it)) // (act as MyBaseActivity).showOrderWithData( // orderSimpleData.orderId.toString(), // orderSimpleData.orderType.toString(), // orderSimpleData.time, // 1, // it // ) } } } @@ -267,6 +276,10 @@ fun orderInfo(data: OrderSimpleData?) } public fun getFirstActivity():Activity{ return activities[0]!! } companion object { private const val TAG = "MyApplication" app/src/main/java/com/ziang/driver/base/MyBaseActivity.java
@@ -1,6 +1,7 @@ package com.ziang.driver.base; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -158,6 +159,10 @@ intent.putExtra("orderType", orderType); intent.putExtra("time", time); intent.putExtra("type", type); Activity act = MyApplication.Companion.getInstance().getFirstActivity(); if (act instanceof VoiceOrderFragment){ return; } startActivity(intent); } app/src/main/java/com/ziang/driver/base/MyBaseFragment.java
@@ -86,10 +86,10 @@ @Override public void showDialog() { // super.showDialog(); if (easyPopup == null){ easyPopup = DialogUtil.INSTANCE.getPopupwindow(getActivity(), R.layout.progress_dialog_main); if (easyPopup == null && isAdded() && isVisible()){ easyPopup = DialogUtil.INSTANCE.getPopupwindow(requireActivity(), R.layout.progress_dialog_main); } if (easyPopup.isShowing()){ if (easyPopup == null || easyPopup.isShowing()){ return; } FragmentActivity activity = getActivity(); app/src/main/java/com/ziang/driver/base/gaode/gpsnav/util/TTSController.java
@@ -67,6 +67,10 @@ public void setVideoText(String s){ try { // if (tts.isPlaying()){ // // } // setVideoTextInNavi(s); tts.playText(s); }catch (Exception e){ app/src/main/java/com/ziang/driver/bean/AgreeBean.java
@@ -1,5 +1,8 @@ package com.ziang.driver.bean; import android.os.Handler; import android.os.Message; public class AgreeBean { /** @@ -14,6 +17,7 @@ public int getCode() { return code; } app/src/main/java/com/ziang/driver/bean/OrderBean.java
@@ -12,6 +12,25 @@ private DataBean data; private String msg; private Long time = 0L; //收到订单时长 private Long overTime = 0L; //倒计时时长 public Long getOverTime() { return overTime; } public void setOverTime(Long overTime) { this.overTime = overTime; } public Long getTime() { return time; } public void setTime(Long time) { this.time = time; } public Integer getCode() { return code; } app/src/main/java/com/ziang/driver/bean/OrderGradData.java
New file @@ -0,0 +1,20 @@ package com.ziang.driver.bean; import com.google.gson.annotations.SerializedName; import java.util.Map; public class OrderGradData { public Map<String,String> orderId; public int orderType; @SerializedName("state") public int time; // { // "code": 200, // "msg": "SUCCESS", // "method": "ORDER_STATUS", // "data": { // "orderId": 21414, #订单id // } } app/src/main/java/com/ziang/driver/netUtls/HttpManager.java
@@ -102,7 +102,7 @@ initHeader(); // 监听请求条件 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(20, TimeUnit.SECONDS); builder.connectTimeout(30, TimeUnit.SECONDS); // builder.addInterceptor(new Interceptor() { // @Override // public Response intercept(Chain chain) throws IOException { @@ -119,22 +119,17 @@ }); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(httpLoggingInterceptor); builder.addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { builder.addInterceptor(chain -> { Request request = chain.request(); Response proceed = chain.proceed(request); return proceed; } }); Retrofit.Builder builder1 = new Retrofit.Builder() .client(builder.build()) // 配置监听请求 .addConverterFactory(GsonConverterFactory.create()) // 请求结果转换(当前为GSON) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()); // 请求接受工具(当前为RxJava2) // builder1.baseUrl(BASE_URL + action.substring(0, action.lastIndexOf("/") + 1)); builder1.baseUrl(Api.BASE_URL); return builder1.build(); } app/src/main/java/com/ziang/driver/netUtls/NetKit.kt
@@ -47,6 +47,10 @@ clickAction(responseString) } override fun onError(e: Throwable) { super.onError(e) } }) } @@ -128,6 +132,35 @@ } fun MyBaseActivity.callNetAndError( b: Boolean, api: String, map: HashMap<String?, Any?>, clickAction: (responseString: String?) -> Unit, clickActionError: (errorString: String?) -> Unit ) { if (b) this.showDialog() if (api.startsWith("api")) { map["appid"] = getAppId() var sign = DES.getSign(map) map["sign"] = sign } HttpManager.getInstance().post(api, map, object : MyObserver(this) { override fun success(responseString: String?) { if (b) dismissDialog() clickAction(responseString) } override fun onError(code: Int, msg: String?, resposeString: String?) { // super.onError(code, msg, resposeString) clickActionError(msg) } }) } fun MyBaseActivity.callNetNoToast( api: String, map: HashMap<String?, Any?>, @@ -207,6 +240,39 @@ } fun MyBaseFragment.callNet( b: Boolean, api: String, map: HashMap<String?, Any?>, clickAction: (responseString: String?) -> Unit, clickActionError: (errorString: String?) -> Unit ) { if (b) { this.showDialog() } if (api.startsWith("api")) { map["appid"] = getAppId() var sign = DES.getSign(map) map["sign"] = sign } HttpManager.getInstance().post(api, map, object : MyObserver(this) { override fun success(responseString: String?) { if (b) { dismissDialog() } clickAction(responseString) } override fun onError(code: Int, msg: String?, resposeString: String?) { super.onError(code, msg, resposeString) clickActionError(msg) } }) } fun callNet( context: Context, api: String, app/src/main/java/com/ziang/driver/ui/adapter/MainSmallAdapter.kt
New file @@ -0,0 +1,101 @@ package com.ziang.driver.ui.adapter import android.os.CountDownTimer import android.view.View import cn.sinata.xldutils.utils.Toast import cn.sinata.xldutils.utils.clickDelay import com.amap.api.maps.model.LatLng import com.ziang.driver.R import com.ziang.driver.base.BaseRvAdapter import com.ziang.driver.base.BaseViewHolder import com.ziang.driver.base.MyApplication import com.ziang.driver.base.gaode.AMapKit import com.ziang.driver.bean.OrderBean import com.ziang.driver.netUtls.Api import com.ziang.driver.netUtls.callNet import com.ziang.driver.netUtls.getMapByAny import com.ziang.driver.netUtls.timeOver import com.ziang.driver.ui.main.TripActivity import kotlinx.android.synthetic.main.item_get_order.tv_sure import kotlinx.android.synthetic.main.item_small_order.view.tv_car_type import kotlinx.android.synthetic.main.item_small_order.view.tv_close import kotlinx.android.synthetic.main.item_small_order.view.tv_end import kotlinx.android.synthetic.main.item_small_order.view.tv_reassign import kotlinx.android.synthetic.main.item_small_order.view.tv_start import kotlinx.android.synthetic.main.item_small_order.view.tv_sure import kotlinx.android.synthetic.main.item_small_order.view.tv_time import kotlinx.android.synthetic.main.item_small_order.view.tv_title import org.jetbrains.anko.startActivity class MainSmallAdapter:BaseRvAdapter<OrderBean>() { var orderType = 0 override fun getLayoutResId(viewType: Int): Int { return R.layout.item_small_order } override fun onBindItem(holder: BaseViewHolder?, view: View?, item: OrderBean?) { item?.let { data -> holder?.let { it.mDownTimer?.cancel() it.itemView.tv_car_type.text = "小程序订单" it.itemView.tv_reassign.text = data.data.type it.itemView.tv_time.text = data.data.travelTime it.itemView.tv_start.text = data.data.startAddress it.itemView.tv_end.text = data.data.endAddress AMapKit.initRouteLine( context, LatLng(MyApplication.getLocation().latitude, MyApplication.getLocation().longitude), LatLng(data.data.startLat, data.data.startLon), object : (MutableList<LatLng>, Float, Long) -> Unit { override fun invoke( latLngs: MutableList<LatLng>, lineTance: Float, lineTime: Long ) { it.itemView.tv_title.text = "距您约" + AMapKit.getTance(lineTance) } }) it.itemView.tv_close.clickDelay { getData().remove(data) notifyDataSetChanged() } it.itemView.tv_sure.clickDelay { var map = getMapByAny() map["orderId"] = data.data.orderId.toString() map["orderType"] = orderType.toString() callNet(context, Api.grabOrder, map) { Toast.create(context).show("抢单成功") // context.startActivity<TripActivity>("orderId" to data.data.orderId.toString() // , "orderType" to orderType.toString()) getData().remove(data) notifyDataSetChanged() } } holder.mDownTimer = timeOvers((data.overTime.toLong() * 1000L),holder) { if (it == 0) { getData().remove(data) notifyDataSetChanged() } else { data.overTime = (data.overTime.toLong()-1) holder.itemView.tv_sure.text = "抢单" + it.toString() + "S" } } } } } override fun onViewRecycled(holder: BaseViewHolder) { holder.mDownTimer?.cancel() super.onViewRecycled(holder) } private fun timeOvers(timeDown: Long, holder: BaseViewHolder, click: (mill: Int) -> Unit): CountDownTimer { return object : CountDownTimer(timeDown, 1000) { override fun onFinish() = click(0) override fun onTick(millisUntilFinished: Long) = click((millisUntilFinished / 1000).toInt()) }.apply { start() } } } app/src/main/java/com/ziang/driver/ui/adapter/OrderHallAdapter.kt
@@ -27,7 +27,6 @@ return R.layout.item_hall } private val audioRecoderUtils by lazy { AudioRecoderUtils() } override fun onBindItem(holder: BaseViewHolder?, view: View?, item: OrderHall) { holder?.let { @@ -49,19 +48,20 @@ ) it.itemView.tv_play.visible() it.itemView.tv_play.setOnClickListener { val intent = Intent(context, VoiceOrderFragment::class.java) intent.putExtra("audio", item.audioLinkUrl) intent.putExtra("orderId", item.id) intent.putExtra("orderType", item.type.toString()) intent.putExtra("time", item.audioTime.toInt()+3) intent.putExtra("type", 1) intent.putExtra("needPlayRing", false) intent.putExtra("fromList", true) context.startActivity(intent) AudioRecoderUtils.getInstance().startplayMusic(context, item.audioLinkUrl) // val intent = Intent(context, VoiceOrderFragment::class.java) // intent.putExtra("audio", item.audioLinkUrl) // intent.putExtra("orderId", item.id) // intent.putExtra("orderType", item.type.toString()) // intent.putExtra("time", item.audioTime.toInt()+3) // intent.putExtra("type", 1) // intent.putExtra("needPlayRing", false) // intent.putExtra("fromList", true) // context.startActivity(intent) } } it.itemView.tv_action.setOnClickListener { getOrder(item.id, item.type, context, !item.audioLinkUrl.isNullOrEmpty()) getOrder(item,item.id, item.type, context, !item.audioLinkUrl.isNullOrEmpty()) } val l = TimeUtils.parseTimeMillisecond(item.endTime) - System.currentTimeMillis() it.itemView.tv_timer.text = if (l>0) "%02d:%02d".format( @@ -71,7 +71,7 @@ } } private fun getOrder(orderId: String, orderType: Int, context: Context, isCall: Boolean) { private fun getOrder( item: OrderHall,orderId: String, orderType: Int, context: Context, isCall: Boolean) { var map = getMapByAny() map["orderId"] = orderId map["orderType"] = orderType @@ -82,7 +82,7 @@ "orderId" to orderId, "orderType" to orderType.toString() ) audioRecoderUtils.stopPlayMusic() AudioRecoderUtils.getInstance().stopPlayMusic() }else{ when (orderType) { 2 -> { @@ -105,7 +105,9 @@ } } } (context as OrderHallActivity).finish() data.remove(item) notifyDataSetChanged() // (context as OrderHallActivity).finish() } } app/src/main/java/com/ziang/driver/ui/main/CallOrderActivity.kt
@@ -29,7 +29,6 @@ lateinit var orderBean: OrderBean private val audioRecoderUtils by lazy { AudioRecoderUtils() } override fun setContentView() { setContentView(R.layout.activity_order_call) @@ -96,7 +95,7 @@ override fun onDestroy() { super.onDestroy() handler?.removeCallbacksAndMessages(null) audioRecoderUtils.stopPlayMusic() AudioRecoderUtils.getInstance().stopPlayMusic() } @@ -108,7 +107,7 @@ override fun setOnclick() { tv_play.setOnClickListener { audioRecoderUtils.startplayMusic(this,orderBean.data.audioLinkUrl) AudioRecoderUtils.getInstance().startplayMusic(this,orderBean.data.audioLinkUrl) } } } app/src/main/java/com/ziang/driver/ui/main/GetOrderFragment.kt
@@ -5,18 +5,45 @@ import android.os.PersistableBundle import android.view.View import cn.sinata.xldutils.activitys.DialogActivity import cn.sinata.xldutils.utils.* import cn.sinata.xldutils.utils.Toast import cn.sinata.xldutils.utils.clickDelay import cn.sinata.xldutils.utils.doubleTwo import cn.sinata.xldutils.utils.gone import cn.sinata.xldutils.utils.sysErr import cn.sinata.xldutils.utils.visible import com.amap.api.maps.AMap import com.amap.api.maps.model.LatLng import com.google.gson.Gson import com.ziang.driver.R import com.ziang.driver.base.BaseEvent import com.ziang.driver.base.MyApplication import com.ziang.driver.base.gaode.AMapKit import com.ziang.driver.bean.OrderBean import com.ziang.driver.netUtls.* import com.ziang.driver.netUtls.Api import com.ziang.driver.netUtls.callNet import com.ziang.driver.netUtls.createView import com.ziang.driver.netUtls.getMapByAny import com.ziang.driver.netUtls.timeOver import com.ziang.driver.ui.UiUtil import com.google.gson.Gson import kotlinx.android.synthetic.main.item_get_order.* import kotlinx.android.synthetic.main.item_map_market.view.* import kotlinx.android.synthetic.main.item_get_order.map_view import kotlinx.android.synthetic.main.item_get_order.tv_car_type import kotlinx.android.synthetic.main.item_get_order.tv_cargo_money import kotlinx.android.synthetic.main.item_get_order.tv_cargo_num import kotlinx.android.synthetic.main.item_get_order.tv_close import kotlinx.android.synthetic.main.item_get_order.tv_end import kotlinx.android.synthetic.main.item_get_order.tv_money import kotlinx.android.synthetic.main.item_get_order.tv_name import kotlinx.android.synthetic.main.item_get_order.tv_reassign import kotlinx.android.synthetic.main.item_get_order.tv_remark import kotlinx.android.synthetic.main.item_get_order.tv_start import kotlinx.android.synthetic.main.item_get_order.tv_sure import kotlinx.android.synthetic.main.item_get_order.tv_tance import kotlinx.android.synthetic.main.item_get_order.tv_time import kotlinx.android.synthetic.main.item_get_order.tv_title import kotlinx.android.synthetic.main.item_map_market.view.iv_img import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.jetbrains.anko.startActivity class GetOrderFragment : DialogActivity() { @@ -101,6 +128,7 @@ override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) EventBus.getDefault().register(this) map_view.onCreate(savedInstanceState) } @@ -108,6 +136,7 @@ super.onDestroy() time.cancel() MyApplication.getTTsManager().stopSpeaking() EventBus.getDefault().unregister(this) map_view.onDestroy() } @@ -241,4 +270,15 @@ } } @Subscribe(threadMode = ThreadMode.MAIN) open fun onEventMainThread(event: BaseEvent) { when (event.code) { BaseEvent.ORDER_GRAB_EVENT -> { if (orderId == event.msg) finish() } } } } app/src/main/java/com/ziang/driver/ui/main/MainActivity.kt
@@ -8,10 +8,12 @@ import android.net.Uri import android.os.Handler import android.os.Looper import android.os.Message import android.provider.Settings import android.view.Gravity import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.recyclerview.widget.LinearLayoutManager import cn.sinata.rxnetty.NettyClient import cn.sinata.xldutils.utils.* import com.amap.api.location.AMapLocation @@ -44,7 +46,9 @@ import com.umeng.socialize.PlatformConfig import com.ziang.driver.bean.* import com.ziang.driver.netUtls.* import com.ziang.driver.ui.adapter.OrderHallAdapter import com.ziang.driver.ui.mine.RechargeActivity import com.ziang.driver.utils.DES import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.app_title.* import kotlinx.android.synthetic.main.dialog_sure_and_del.view.* @@ -59,15 +63,26 @@ val mainFragment by lazy { MainFragment() } val smallFragment by lazy { MainSmallFragment() } val hallAdapter by lazy { OrderHallAdapter() } var queryNum = 0 // val evalFrag = OrderHallFragment() var homeDataBean: HomeDataBean? = null override fun setContentView() { setContentView(R.layout.activity_main) } private val EasyFloatTag = "BACKGROUND" private var floater: EasyFloat.Builder? = null //浮窗 private var paused:Boolean = false private var timeHandler = Handler(Looper.getMainLooper()) //用于检测小程序订单时间 override fun initView() { MapsInitializer.updatePrivacyShow(this,true,true) @@ -76,11 +91,17 @@ // var intent = Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); // intent.setData(Uri.parse("package:" + packageName)); // startActivity(intent); // addFragment(evalFrag, R.id.fl_container_t) recycler_view_hall.layoutManager = LinearLayoutManager(this) recycler_view_hall.adapter = hallAdapter upDateSmall() MyApplication.getInstance()?.initPersionDate() setTitleText("子昂出行司机") if (CacheKey.getKeyStr(Const.REFUSE_LOCATION).isNotEmpty()&&!RxPermissions(this).isGranted( if (CacheKey.getKeyStr(Const.REFUSE_LOCATION) .isNotEmpty() && !RxPermissions(this).isGranted( Manifest.permission.ACCESS_FINE_LOCATION )){ ) ) { toast("没有定位权限,您将无法收到新订单推送") }else{ if (!RxPermissions(this).isGranted(Manifest.permission.ACCESS_FINE_LOCATION)){ @@ -92,7 +113,8 @@ { }){ val subscribe = RxPermissions(this).request(Manifest.permission.ACCESS_FINE_LOCATION).subscribe { RxPermissions(this).request(Manifest.permission.ACCESS_FINE_LOCATION) .subscribe { if (!it){ toast("没有定位权限,您将无法收到新订单推送") CacheKey.putKeyStr(Const.REFUSE_LOCATION, "1") @@ -103,7 +125,8 @@ } tv_Left.setDrawableLeft(R.mipmap.icon_nav_user) iv_right_title.setImageResource(R.mipmap.icon_nav_news) addFragment(mainFragment, R.id.rl_container) addFragment(smallFragment, R.id.rl_container) // addFragment(mainFragment, R.id.rl_container) AMapKit.initLocation(this, this) MyApplication.isLogin = true beOnDuty(false) @@ -112,6 +135,39 @@ callVersion() checkGps() MyApplication.addOrderView(qeeOrderView) } private fun callHall() { var map = getMapByAny() map.set("size",100) map.set("pageNum",1) callNetAndError(false,Api.queryHallOrderList,map,{ var data = gson.fromJson<OrderHallBean>(it,OrderHallBean::class.java) hallAdapter.data.clear() hallAdapter.data.addAll(data.data.list) hallAdapter.notifyDataSetChanged() tv_order_big_all.text = "接单大厅("+hallAdapter.data.size+")" }){ } } /*** * 一秒检测一次小程序订单时间 */ private fun upDateSmall() { timeHandler.postDelayed({ queryNum++ var size = smallFragment.mainSmallAdapter.data.size tv_order_small.text = "小程序订单($size)" upDateSmall() if (queryNum%10 == 0){ callHall() } }, 1000) } @@ -122,8 +178,10 @@ 1,2,3 -> { if (it.status == 10 || it.status == 12) { Handler(Looper.getMainLooper()).post { if (mainFragment?.isAdded && mainFragment?.isVisible){ mainFragment?.refresh() MyApplication.getTTsManager().setVideoText("有用户订单被取消或改派") } } } } @@ -135,7 +193,12 @@ private fun checkGps() { if (!AMapKit.isLocServiceEnable(this)){ DialogUtil.getDelAndSureDialog(this,"查看定位","退出","您暂未开启手机定位GPS,是否前往开启?",{ DialogUtil.getDelAndSureDialog( this, "查看定位", "退出", "您暂未开启手机定位GPS,是否前往开启?", { onBackPressed() }){ val intent = Intent() @@ -230,8 +293,11 @@ override fun onResume() { super.onResume() paused = false callOrderCount() // callOrderCount() // mainFragment.showQuan = false if (mainFragment != null && mainFragment.isAdded && mainFragment.isVisible){ mainFragment?.refresh() } } override fun onPause() { @@ -246,6 +312,13 @@ }else{ avv_anim.gone() tv_up_avv.gone() } } override fun onDestroy() { super.onDestroy() if (timeHandler != null) { timeHandler.removeCallbacksAndMessages(0) } } @@ -268,7 +341,12 @@ if (!Settings.canDrawOverlays(this) && CacheKey.getKeyStr("isRefusedFloat") .isNullOrEmpty() ) { //没有浮窗权限并且没有拒绝过 DialogUtil.getDelAndSureDialog(this, "去开启", "取消", "为了增加后台推单的稳定性,我们需要开启悬浮窗口权限", { DialogUtil.getDelAndSureDialog( this, "去开启", "取消", "为了增加后台推单的稳定性,我们需要开启悬浮窗口权限", { CacheKey.putKeyStr("isRefusedFloat", "1") }) { var intent = Intent( @@ -312,6 +390,8 @@ tv_server_ing.setOnClickListener { tv_server_ing.textColor(this, R.color.main_yellow) tv_wait_server.textColor(this, R.color.main_gray) tv_order_small.textColor(this, R.color.main_gray) addFragment(mainFragment, R.id.rl_container) mainFragment.state = 1 mainFragment.autoRefresh() } @@ -319,8 +399,19 @@ tv_wait_server.setOnClickListener { tv_server_ing.textColor(this, R.color.main_gray) tv_wait_server.textColor(this, R.color.main_yellow) tv_order_small.textColor(this, R.color.main_gray) addFragment(mainFragment, R.id.rl_container) mainFragment.state = 2 mainFragment.autoRefresh() } tv_order_small.clickDelay { tv_server_ing.textColor(this, R.color.main_gray) tv_wait_server.textColor(this, R.color.main_gray) tv_order_small.textColor(this, R.color.main_yellow) addFragment(smallFragment, R.id.rl_container) smallFragment.mainSmallAdapter.notifyDataSetChanged() } tv_Left.clickDelay { @@ -405,7 +496,6 @@ } private var mBackAppTime: Long = 0 @@ -425,27 +515,48 @@ beOnDuty(true) initCall() } BaseEvent.CHANGE_CAR_SUCCESS -> { initCall() } BaseEvent.CALL_NUM_MAIN -> { callNum() } BaseEvent.REFREASH_MAIN -> { mainFragment?.refresh() } BaseEvent.APP_BACKGROUND -> { if (getUserId() != -1 &&homeDataBean?.data?.work == 1 && Settings.canDrawOverlays(this) ) { if (getUserId() != -1 && homeDataBean?.data?.work == 1 && Settings.canDrawOverlays( this ) ) { showFloater() EasyFloat.show(EasyFloatTag) } } BaseEvent.APP_FOREGROUND -> { EasyFloat.hide(EasyFloatTag) } BaseEvent.APP_LOG -> { // tv_log.text = "${TimeUtils.getCurrentTimeMillisecond(System.currentTimeMillis())} ${event.msg}\n"+tv_log.text } BaseEvent.GET_SMALL_ORDER -> { //小程序订单来了 var dataStr = event.msg val data = Gson().fromJson<OrderBean>(dataStr, OrderBean::class.java) data.time = System.currentTimeMillis() data.overTime = event.typeTwo.toLong() smallFragment.setOrdertypeA(event.type) smallFragment.setDate(data) var size = smallFragment.mainSmallAdapter.data.size tv_order_small.text = "小程序订单($size)" } } } app/src/main/java/com/ziang/driver/ui/main/MainSmallFragment.kt
New file @@ -0,0 +1,61 @@ package com.ziang.driver.ui.main import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import cn.sinata.xldutils.fragment.BaseFragment import com.ziang.driver.R import com.ziang.driver.bean.OrderBean import com.ziang.driver.ui.adapter.MainSmallAdapter import kotlinx.android.synthetic.main.fragment_main_small.recycler_view_main_small class MainSmallFragment:BaseFragment() { val mainSmallAdapter: MainSmallAdapter by lazy { MainSmallAdapter() } fun setOrdertypeA(orderType:Int){ mainSmallAdapter.orderType = orderType } override fun getContentViewLayoutID(): Int { return R.layout.fragment_main_small } override fun onFirstVisibleToUser() { } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_main_small,container,false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) recycler_view_main_small.layoutManager = LinearLayoutManager(requireContext()) recycler_view_main_small.adapter = mainSmallAdapter } fun setDate(orderBean: OrderBean){ mainSmallAdapter.data.add(orderBean) mainSmallAdapter.notifyItemInserted(mainSmallAdapter.data.lastIndex) } override fun onVisibleToUser() { } override fun onInvisibleToUser() { } } app/src/main/java/com/ziang/driver/ui/main/VoiceOrderFragment.kt
@@ -12,6 +12,8 @@ import com.ziang.driver.utils.AudioRecoderUtils import kotlinx.android.synthetic.main.dialog_voice_order.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.jetbrains.anko.longToast import org.jetbrains.anko.startActivity @@ -45,42 +47,60 @@ } lateinit var time: CountDownTimer private val audioRecoderUtils by lazy { AudioRecoderUtils() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) EventBus.getDefault().register(this) var strBtn = "抢单" if (type == 2) { strBtn = "确定" } time = timeOver((timeDown!!.toLong() * 1000L)) { if (it == 0) { audioRecoderUtils.stopPlayMusic() finish() } else { tv_sure.text = strBtn + it.toString() + "S" } } tv_close.clickDelay { audioRecoderUtils.stopPlayMusic() finish() } tv_sure.clickDelay { showGetOrder() } if (needPlayRing) AudioRecoderUtils().startplayMusic(this,Const.voiceOrder) iv_voice.postDelayed({ audioRecoderUtils.startplayMusic(this,if (fromList) audio else MyApplication.voiceOrder?.audioLinkUrl) EventBus.getDefault().post(BaseEvent(BaseEvent.APP_LOG,"实际播放路径:${if (fromList) audio else MyApplication.voiceOrder?.audioLinkUrl}")) },2000) iv_voice.clickDelay { audioRecoderUtils.startplayMusic(this,if (fromList) audio else MyApplication.voiceOrder?.audioLinkUrl) if (needPlayRing){ AudioRecoderUtils.getInstance().startplayMusic(this, Const.voiceOrder) if (fromList){ AudioRecoderUtils.getInstance().startplayMusic(this, audio) }else{ AudioRecoderUtils.getInstance().startplayMusic(this, MyApplication.voiceOrder?.audioLinkUrl) } EventBus.getDefault().post(BaseEvent(BaseEvent.APP_LOG,"弹窗订单id:$orderId ,声音路径:$audio")) } iv_voice.postDelayed({ if (!isFinishing){ // AudioRecoderUtils.getInstance().startplayMusic( // this, // if (fromList) audio else MyApplication.voiceOrder?.audioLinkUrl // ) } EventBus.getDefault().post( BaseEvent( BaseEvent.APP_LOG, "实际播放路径:${if (fromList) audio else MyApplication.voiceOrder?.audioLinkUrl}" ) ) }, 500) iv_voice.clickDelay { AudioRecoderUtils.getInstance().startplayMusic( this, if (fromList) audio else MyApplication.voiceOrder?.audioLinkUrl ) } EventBus.getDefault() .post(BaseEvent(BaseEvent.APP_LOG, "弹窗订单id:$orderId ,声音路径:$audio")) } override fun initView() { @@ -93,6 +113,8 @@ override fun onDestroy() { super.onDestroy() EventBus.getDefault().unregister(this) // AudioRecoderUtils.getInstance().stopPlayMusic() time.cancel() } @@ -110,9 +132,22 @@ EventBus.getDefault().post(BaseEvent(BaseEvent.APP_LOG,"抢单成功的id:$id")) startActivity<CallOrderActivity>( "orderId" to id, "orderType" to orderType) audioRecoderUtils.stopPlayMusic() "orderType" to orderType ) finish() } } @Subscribe(threadMode = ThreadMode.MAIN) open fun onEventMainThread(event: BaseEvent) { when (event.code) { BaseEvent.ORDER_GRAB_EVENT -> { if (orderId == event.msg) finish() } } } } app/src/main/java/com/ziang/driver/ui/mine/MineActivity.kt
@@ -28,6 +28,8 @@ import com.umeng.socialize.bean.SHARE_MEDIA import com.umeng.socialize.media.UMImage import com.umeng.socialize.media.UMWeb import com.ziang.driver.base.Const import com.ziang.driver.utils.AudioRecoderUtils import kotlinx.android.synthetic.main.activity_mine.* import kotlinx.android.synthetic.main.pop_share.view.* import org.jetbrains.anko.startActivity @@ -72,8 +74,13 @@ } } override fun setOnclick() { tv_left_title_mine.clickDelay { // AudioRecoderUtils.getInstance().startplayMusic(this, Const.voiceOrder) // AudioRecoderUtils.getInstance().startplayMusic(this,Const.voiceOrder) // MyApplication.getTTsManager().setVideoText("您正在上班中") onBackPressed() } ll_mine_money.setOnClickListener { app/src/main/java/com/ziang/driver/utils/AudioRecoderUtils.java
@@ -10,10 +10,49 @@ import java.io.File; import java.io.IOException; import java.util.LinkedList; import java.util.Queue; import cn.sinata.xldutils.utils.TimeUtils; public class AudioRecoderUtils { // --- 单例实例 --- private static AudioRecoderUtils instance; // 静态变量,持有唯一实例 // 私有化构造函数,防止外部直接创建新实例 private AudioRecoderUtils() { // 默认保存路径为/sdcard/record/下 this(Environment.getExternalStorageDirectory() + "/record/"); } // 私有化带 filePath 的构造函数 private AudioRecoderUtils(String filePath) { File path = new File(filePath); if (!path.exists()) path.mkdirs(); this.FolderPath = filePath; } // --- 获取单例的公共静态方法 --- // 使用 synchronized 确保线程安全,防止多线程环境下创建多个实例 public static synchronized AudioRecoderUtils getInstance() { if (instance == null) { instance = new AudioRecoderUtils(); } return instance; } // 如果需要指定文件路径,可以提供另一个获取实例的方法 public static synchronized AudioRecoderUtils getInstance(String filePath) { if (instance == null) { instance = new AudioRecoderUtils(filePath); } // 如果实例已存在但路径不同,这里通常不修改路径。 // 若要支持动态路径,需要更复杂的逻辑,或者在外部处理路径逻辑。 return instance; } // --- 单例修改结束 --- //文件路径 private String filePath; @@ -27,130 +66,13 @@ private OnAudioStatusUpdateListener audioStatusUpdateListener; private MediaPlayer mMediaPlayer; /** * 文件存储默认sdcard/record */ public AudioRecoderUtils() { //默认保存路径为/sdcard/record/下 this(Environment.getExternalStorageDirectory() + "/record/"); } public AudioRecoderUtils(String filePath) { File path = new File(filePath); if (!path.exists()) path.mkdirs(); this.FolderPath = filePath; } // --- 新增:播放队列和状态变量 --- private Queue<String> playQueue = new LinkedList<>(); // 存储待播放的音频文件路径 private boolean isPlayingQueue = false; // 标记是否正在播放队列中的音频 // --- 新增结束 --- private long startTime; private long endTime; /** * 开始录音 使用amr格式 * 录音文件 * * @return */ public void startRecord() { // 开始录音 /* ①Initial:实例化MediaRecorder对象 */ if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder(); try { /* ②setAudioSource/setVedioSource */ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风 /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */ mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS); /* * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式 * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB) */ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); filePath = FolderPath + TimeUtils.getCurrentTime() + ".caf"; /* ③准备 */ mMediaRecorder.setOutputFile(filePath); mMediaRecorder.setMaxDuration(MAX_LENGTH); mMediaRecorder.prepare(); /* ④开始 */ mMediaRecorder.start(); // AudioRecord audioRecord. /* 获取开始时间* */ startTime = System.currentTimeMillis(); updateMicStatus(); Log.e("fan", "startTime" + startTime); } catch (IllegalStateException e) { Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage()); } catch (IOException e) { Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage()); } } /** * 停止录音 */ public long stopRecord() { if (mMediaRecorder == null) return 0L; endTime = System.currentTimeMillis(); //有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈! try { mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; audioStatusUpdateListener.onStop(filePath); filePath = ""; } catch (RuntimeException e) { if (mMediaRecorder != null) { mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } File file = new File(filePath); if (file.exists()) file.delete(); filePath = ""; } return endTime - startTime; } public String getFilePath() { return filePath; } /** * 取消录音 */ public void cancelRecord() { try { mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } catch (RuntimeException e) { mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } File file = new File(filePath); if (file.exists()) file.delete(); filePath = ""; } private final Handler mHandler = new Handler(); private Runnable mUpdateMicStatusTimer = new Runnable() { @@ -163,9 +85,7 @@ private int BASE = 1; private int SPACE = 100;// 间隔取样时间 public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) { this.audioStatusUpdateListener = audioStatusUpdateListener; } /** * 更新麦克状态 @@ -206,80 +126,150 @@ public void onFinishPlay(); } //开始播放录音 public void startplayMusic(Context context, String filePath) { if (mMediaPlayer != null) { stopPlayMusic(); // 将新的音频路径添加到播放队列 playQueue.offer(filePath); // 将文件路径添加到队列尾部 Log.e("AudioRecoderUtils", "Added to queue: " + filePath + ", Queue size: " + playQueue.size()); // 如果当前没有在播放,则开始播放队列中的第一个 if (!isPlayingQueue) { playNextInQueue(context); } } // --- 新增:播放队列中的下一个音频 --- private void playNextInQueue(Context context) { if (playQueue.isEmpty()) { isPlayingQueue = false; Log.d(TAG, "playNextInQueue: Play queue finished."); if (audioStatusUpdateListener != null) { audioStatusUpdateListener.onFinishPlay(); } return; } String currentFilePath = playQueue.poll(); Log.d(TAG, "playNextInQueue: Now attempting to play from queue: " + currentFilePath); // 确保每次播放前,旧的 MediaPlayer 都已经被彻底释放 // 这行虽然在前面已经有,但此处是核心逻辑,再次强调其重要性 if (mMediaPlayer != null) { stopPlayMusic(); // 确保旧的播放器已完全释放 } mMediaPlayer = new MediaPlayer(); isPlayingQueue = true; // 标记正在播放队列中的音频 try { Log.e("mmp", "path:" + filePath); mMediaPlayer.setDataSource(context, Uri.parse(filePath)); mMediaPlayer.setDataSource(context, Uri.parse(currentFilePath)); Log.d(TAG, "playNextInQueue: Set data source for: " + currentFilePath + ", preparing async."); mMediaPlayer.prepareAsync(); mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // 装载完毕回调 mMediaPlayer.start(); mMediaPlayer.setOnPreparedListener(mp -> { Log.d(TAG, "onPrepared: MediaPlayer prepared for " + currentFilePath + ", starting playback."); mp.start(); // 这里使用 mp,它是 MediaPlayer 实例本身 if (audioStatusUpdateListener != null) audioStatusUpdateListener.onStartPlay(); } }); mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { if (audioStatusUpdateListener != null) audioStatusUpdateListener.onFinishPlay(); stopPlayMusic(); // BaseEvent baseEvent = new BaseEvent(BaseEvent.SEND_AODIO_PLAY_OVER); // baseEvent.setMsg(filePath); // EventBus.getDefault().post(baseEvent); } }); } catch (Exception e) { e.printStackTrace(); } } mMediaPlayer.setOnCompletionListener(mp -> { Log.d(TAG, "onCompletion: Playback finished for " + currentFilePath + ", moving to next."); // 注意:onFinishPlay() 应该在整个队列播放完毕时才触发,而不是单个文件 stopPlayMusic(); // 播放完成后释放当前播放器 playNextInQueue(context); // 递归调用,播放队列中的下一个 }); //结束录音播放 public void stopPlayMusic() { if (mMediaPlayer == null) return; try { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer.setOnErrorListener((mp, what, extra) -> { Log.e(TAG, "onError: MediaPlayer error occurred: what=" + what + ", extra=" + extra + " for " + currentFilePath); // 错误发生时,也要通知UI(如果需要),并尝试播放下一个 if (audioStatusUpdateListener != null) audioStatusUpdateListener.onFinishPlay(); } catch (IllegalStateException e) { e.printStackTrace(); } } audioStatusUpdateListener.onFinishPlay(); // 通知当前文件播放失败 stopPlayMusic(); // 释放当前播放器 playNextInQueue(context); // 继续播放队列中的下一个 return true; // 表示已处理错误 }); /** * 获取文件长度 * * @param context * @param filePath * @return */ public int getMusicTime(Context context, String filePath) { if (mMediaPlayer != null) { stopPlayMusic(); } mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource(context, Uri.parse(filePath)); mMediaPlayer.prepare(); int duration = mMediaPlayer.getDuration(); if (0 != duration) { mMediaPlayer.release(); return duration / 1000; } } catch (IOException e) { // IOException 通常是文件不存在、无法读取或URL无效 Log.e(TAG, "IOException during MediaPlayer setup for " + currentFilePath, e); // 捕获异常后,也要尝试播放下一个 if (audioStatusUpdateListener != null) audioStatusUpdateListener.onFinishPlay(); // 通知播放失败 stopPlayMusic(); // 释放当前播放器 playNextInQueue(context); // 继续播放队列中的下一个 } catch (IllegalArgumentException e) { // IllegalArgumentException 可能是URI格式不正确等 Log.e(TAG, "IllegalArgumentException during MediaPlayer setup for " + currentFilePath, e); if (audioStatusUpdateListener != null) audioStatusUpdateListener.onFinishPlay(); // 通知播放失败 stopPlayMusic(); playNextInQueue(context); } catch (SecurityException e) { // SecurityException 可能是权限问题 Log.e(TAG, "SecurityException during MediaPlayer setup for " + currentFilePath, e); if (audioStatusUpdateListener != null) audioStatusUpdateListener.onFinishPlay(); // 通知播放失败 stopPlayMusic(); playNextInQueue(context); } catch (IllegalStateException e) { // IllegalStateException 可能是 MediaPlayer 状态不正确 Log.e(TAG, "IllegalStateException during MediaPlayer setup for " + currentFilePath, e); if (audioStatusUpdateListener != null) audioStatusUpdateListener.onFinishPlay(); // 通知播放失败 stopPlayMusic(); playNextInQueue(context); } catch (Exception e) { // 最后捕获所有其他未知异常 Log.e(TAG, "Generic Exception during MediaPlayer setup for " + currentFilePath, e); e.printStackTrace(); if (audioStatusUpdateListener != null) audioStatusUpdateListener.onFinishPlay(); // 通知播放失败 stopPlayMusic(); playNextInQueue(context); } return 0; } // --- 新增结束 --- public void stopPlayMusic() { // playQueue.clear(); isPlayingQueue = false; if (mMediaPlayer == null) { Log.d(TAG, "stopPlayMusic: MediaPlayer is null, nothing to stop."); return; } try { // 检查 MediaPlayer 是否处于可停止的状态 // 如果正在准备或处于错误状态,直接 release 可能更安全 if (mMediaPlayer.isPlaying()) { mMediaPlayer.stop(); // 停止当前播放 Log.d(TAG, "stopPlayMusic: Stopped active MediaPlayer."); } mMediaPlayer.release(); // 释放资源 mMediaPlayer = null; // 置为 null,防止内存泄漏和引用旧对象 Log.d(TAG, "stopPlayMusic: MediaPlayer released and set to null."); } catch (IllegalStateException e) { // 捕获 MediaPlayer 状态异常,例如在 prepareAsync() 期间调用 stop() Log.e(TAG, "stopPlayMusic: IllegalStateException during stop/release.", e); // 即使异常,也要尝试释放并置null,防止后续问题 if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } catch (Exception e) { // 捕获其他未知异常 Log.e(TAG, "stopPlayMusic: General Exception during stop/release.", e); if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } } // 新增设置监听器的方法 public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) { this.audioStatusUpdateListener = audioStatusUpdateListener; } } app/src/main/res/layout/activity_main.xml
@@ -1,49 +1,59 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_height="match_parent" android:layout_width="match_parent" tools:context=".ui.pub.StartActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".ui.pub.StartActivity"> android:orientation="vertical"> <RelativeLayout android:id="@+id/log" android:visibility="gone" android:layout_width="match_parent" android:layout_height="100dp"> android:layout_height="100dp" android:visibility="gone"> <ScrollView android:layout_width="match_parent" android:background="@color/gray" android:layout_height="100dp"> android:layout_height="100dp" android:background="@color/gray"> <TextView android:id="@+id/tv_log" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="10sp" android:textColor="@color/end_red" android:id="@+id/tv_log"/> android:textSize="10sp" /> </ScrollView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/copy" android:text="复制" android:padding="5dp" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:textSize="14sp" android:textColor="@color/textColor"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cls" android:text="清屏" android:padding="5dp" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" android:layout_toStartOf="@id/copy" android:padding="5dp" android:text="复制" android:textColor="@color/textColor" android:textSize="14sp" /> <TextView android:id="@+id/cls" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginEnd="5dp" android:textSize="14sp" android:textColor="@color/textColor"/> android:layout_toStartOf="@id/copy" android:padding="5dp" android:text="清屏" android:textColor="@color/textColor" android:textSize="14sp" /> </RelativeLayout> @@ -67,7 +77,7 @@ android:layout_marginStart="3dp" android:layout_marginTop="21dp" android:layout_toRightOf="@+id/iv_main_icon" android:text="川E 12345" android:text="射洪出租车" android:textColor="#ffffffff" android:textSize="13sp" /> @@ -79,7 +89,7 @@ android:layout_marginStart="3dp" android:layout_marginTop="5dp" android:layout_toRightOf="@+id/iv_main_icon" android:text="广汽传媒传祺GS4 . 白色" android:text="" android:textColor="#ffffffff" android:textSize="13sp" /> @@ -213,50 +223,100 @@ android:id="@+id/ll_order" android:layout_width="match_parent" android:layout_height="50dp" android:layout_below="@id/ll_info" android:layout_marginHorizontal="14dp" android:layout_marginBottom="14dp" android:background="@drawable/bg_white_25" android:orientation="horizontal" android:layout_below="@id/ll_info" android:layout_marginBottom="14dp" android:layout_marginHorizontal="14dp" > android:visibility="gone"> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:id="@+id/tv_1" android:text="接单大厅" android:textColor="@color/main_yellow_qia" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="30dp" android:layout_weight="1" android:drawableStart="@mipmap/ic_order" android:drawablePadding="10dp" android:layout_marginStart="30dp" android:textStyle="bold" android:textSize="14sp"/> android:text="接单大厅" android:textColor="@color/main_yellow_qia" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_count" android:layout_width="20dp" android:layout_height="20dp" android:id="@+id/tv_count" android:layout_gravity="center_vertical|end" android:text="0" android:background="@drawable/red_circle_bg" android:textSize="12sp" android:layout_marginEnd="15dp" android:background="@drawable/red_circle_bg" android:gravity="center" android:text="0" android:textColor="@color/white" android:gravity="center"/> android:textSize="12sp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:src="@mipmap/more_black" android:layout_marginEnd="30dp"/> android:layout_marginEnd="30dp" android:src="@mipmap/more_black" /> </LinearLayout> </RelativeLayout> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="0dp" android:clipToPadding="false" android:paddingBottom="300dp" android:layout_weight="1"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_order_big_all" android:layout_width="match_parent" android:layout_height="37dp" android:background="@color/write" android:gravity="center_vertical" android:paddingStart="14dp" android:text="接单大厅" android:textColor="#ff333333" android:textSize="14sp" /> <include layout="@layout/include_line_14" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view_hall" android:layout_width="match_parent" android:layout_height="wrap_content" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/ll_tab" android:layout_width="match_parent" android:layout_height="40dp" android:background="@color/white" android:orientation="horizontal"> <TextView android:id="@+id/tv_order_small" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="小程序订单" android:textColor="@color/main_yellow" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_server_ing" @@ -265,7 +325,7 @@ android:layout_weight="1" android:gravity="center" android:text="服务中" android:textColor="@color/main_yellow" android:textColor="@color/main_gray" android:textSize="14sp" android:textStyle="bold" /> @@ -282,19 +342,61 @@ </LinearLayout> <include layout="@layout/include_line" /> <RelativeLayout <View android:id="@+id/view_line_tab" android:layout_width="match_parent" android:layout_height="match_parent"> android:layout_height="1px" android:layout_below="@+id/ll_tab" android:alpha="0.3" android:background="#979797" /> <RelativeLayout android:id="@+id/rl_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="61dp" android:background="#F3F4F5" /> android:minHeight="350dp" android:layout_below="@+id/view_line_tab" android:layout_marginBottom="61dp" /> </RelativeLayout> </LinearLayout> </androidx.core.widget.NestedScrollView> </LinearLayout> <RelativeLayout android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="163dp"> <com.wang.avi.AVLoadingIndicatorView android:id="@+id/avv_anim" style="@style/AVLoadingIndicatorView.Small" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="63dp" app:indicatorColor="@color/main_yellow" app:indicatorName="BallScaleMultipleIndicator" /> <TextView android:id="@+id/tv_up_avv" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="63dp" android:gravity="center" android:text="听单中" android:textColor="#ffffffff" android:textSize="14sp" android:textStyle="bold" /> <View android:id="@+id/view_line" @@ -333,11 +435,11 @@ android:layout_width="0dp" android:layout_height="38dp" android:layout_centerInParent="true" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" android:layout_weight="1" android:background="@drawable/car_get_start" android:gravity="center" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" android:text="出车" android:textColor="#ffffffff" android:textSize="14sp" @@ -349,49 +451,21 @@ android:layout_height="38dp" android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" android:layout_weight="1" android:background="@drawable/bg_main_gray" android:gravity="center" android:paddingStart="12dp" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" android:paddingEnd="12dp" android:text="历史订单" android:textColor="#ff333333" android:textSize="14sp" android:textStyle="bold" /> </LinearLayout> <com.wang.avi.AVLoadingIndicatorView android:id="@+id/avv_anim" style="@style/AVLoadingIndicatorView.Small" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="63dp" app:indicatorColor="@color/main_yellow" app:indicatorName="BallScaleMultipleIndicator" /> <TextView android:id="@+id/tv_up_avv" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="63dp" android:gravity="center" android:text="听单中" android:textColor="#ffffffff" android:textSize="14sp" android:textStyle="bold" /> </RelativeLayout> </LinearLayout> </RelativeLayout> app/src/main/res/layout/activity_order_call.xml
@@ -49,7 +49,7 @@ android:layout_marginBottom="11dp" android:drawableStart="@drawable/bg_point_main_color_end" android:drawablePadding="5dp" android:text="柳州市政府" android:text="射洪出租" android:textColor="#ff27282d" android:textSize="14sp" android:textStyle="bold" /> app/src/main/res/layout/activity_order_over_city.xml
@@ -38,7 +38,7 @@ android:layout_marginBottom="11dp" android:drawableStart="@drawable/bg_point_main_color" android:drawablePadding="5dp" android:text="柳州市政府" android:text="政府" android:textColor="#ff27282d" android:textSize="14sp" android:textStyle="bold" /> app/src/main/res/layout/activity_select_start_point.xml
@@ -16,7 +16,7 @@ android:id="@+id/tv_city_name" android:layout_width="wrap_content" android:layout_height="match_parent" android:text="柳州市" android:text="" android:gravity="center" android:paddingStart="14dp" android:paddingEnd="30dp" app/src/main/res/layout/fragment_base_recycler.xml
@@ -29,7 +29,7 @@ <com.scwang.smartrefresh.layout.header.ClassicsHeader android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="80dp" android:gravity="center" /> <FrameLayout @@ -41,6 +41,7 @@ <androidx.core.widget.NestedScrollView android:id="@+id/nsv_base_scoll" android:layout_width="match_parent" android:minHeight="500dp" android:layout_height="match_parent"> <LinearLayout @@ -50,6 +51,7 @@ <FrameLayout android:id="@+id/fl_h_top" android:layout_width="match_parent" android:layout_height="wrap_content" /> @@ -87,7 +89,7 @@ <com.scwang.smartrefresh.layout.footer.ClassicsFooter android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="80dp" android:gravity="center" app:srlTextNothing="没有更多了" app:srlTextSizeTitle="12sp" /> app/src/main/res/layout/fragment_main_small.xml
New file @@ -0,0 +1,14 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.recyclerview.widget.RecyclerView app:layout_constraintTop_toTopOf="parent" android:id="@+id/recycler_view_main_small" android:layout_width="match_parent" android:layout_height="match_parent"/> </androidx.constraintlayout.widget.ConstraintLayout> app/src/main/res/layout/include_order_top.xml
@@ -73,7 +73,7 @@ android:layout_marginBottom="11dp" android:drawableStart="@drawable/bg_point_main_color_end" android:drawablePadding="5dp" android:text="柳州市政府" android:text="射洪出租" android:textColor="#ff27282d" android:textSize="14sp" android:textStyle="bold" /> app/src/main/res/layout/include_order_top_cargo.xml
@@ -73,7 +73,7 @@ android:layout_marginBottom="11dp" android:drawableStart="@drawable/bg_point_main_color" android:drawablePadding="5dp" android:text="柳州市政府" android:text="射洪出租" android:textColor="#ff27282d" android:textSize="14sp" android:textStyle="bold" /> app/src/main/res/layout/item_hall.xml
@@ -93,7 +93,7 @@ android:layout_marginStart="13dp" android:drawableStart="@drawable/bg_point_main_color_end" android:drawablePadding="6dp" android:text="柳州市政府" android:text="射洪出租" android:textStyle="bold" android:textColor="#ff27282d" android:textSize="14sp" app/src/main/res/layout/item_main_list.xml
@@ -85,7 +85,7 @@ android:layout_marginStart="13dp" android:drawableStart="@drawable/bg_point_main_color_end" android:drawablePadding="6dp" android:text="柳州市政府" android:text="射洪出租" android:textStyle="bold" android:textColor="#ff27282d" android:textSize="14sp" app/src/main/res/layout/item_small_order.xml
New file @@ -0,0 +1,219 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_marginTop="10dp" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:orientation="vertical" app:layout_constraintTop_toTopOf="parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="64dp" android:background="@drawable/car_get_top"> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="11dp" android:text="距您约公里" android:textColor="#ffffffff" android:textSize="18sp" /> <TextView android:id="@+id/tv_car_type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" android:layout_alignStart="@+id/tv_title" android:layout_marginTop="3dp" android:text="订单" android:textColor="#ffffffff" android:textSize="13sp" /> <TextView android:id="@+id/tv_reassign" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" android:layout_marginStart="7dp" android:layout_marginTop="2dp" android:layout_toRightOf="@+id/tv_car_type" android:background="@drawable/bg_white_round_2" android:paddingStart="10dp" android:paddingTop="2dp" android:paddingEnd="10dp" android:paddingBottom="2dp" android:text="" android:textColor="#fffd943a" android:textSize="11sp" /> </RelativeLayout> <LinearLayout android:id="@+id/ll_order_top" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" android:orientation="vertical" android:paddingStart="33dp" android:paddingTop="15dp" android:paddingBottom="11dp"> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:layout_marginBottom="6dp" android:drawableStart="@mipmap/icon_time_gray" android:drawablePadding="5dp" android:textColor="#666666" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:layout_marginBottom="6dp" android:drawableStart="@drawable/bg_point_main_color_end" android:drawablePadding="5dp" android:text="" android:textColor="#ff27282d" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_end" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:layout_marginBottom="6dp" android:drawableStart="@drawable/bg_point_main_color" android:drawablePadding="5dp" android:text="" android:textColor="#ff27282d" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_money" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:layout_marginBottom="6dp" android:drawableStart="@mipmap/hongbao" android:drawablePadding="5dp" android:text="" android:textColor="#ff27282d" android:textSize="16sp" android:textStyle="bold" android:visibility="gone" /> <TextView android:id="@+id/tv_remark" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:layout_marginTop="3dp" android:layout_marginBottom="6dp" android:drawableStart="@mipmap/old_man" android:drawablePadding="5dp" android:text="" android:textColor="#ff27282d" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:layout_marginBottom="6dp" android:drawableStart="@mipmap/icon_people_gray" android:drawablePadding="5dp" android:text="" android:textColor="#ff27282d" android:textSize="16sp" android:textStyle="bold" android:visibility="gone" /> <TextView android:id="@+id/tv_cargo_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:layout_marginBottom="6dp" android:drawableStart="@mipmap/icon_item" android:drawablePadding="5dp" android:text="" android:textColor="#ff27282d" android:textSize="16sp" android:textStyle="bold" android:visibility="gone" /> <TextView android:id="@+id/tv_cargo_money" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:layout_marginBottom="6dp" android:drawableStart="@mipmap/icon_rocket" android:drawablePadding="5dp" android:text="" android:textColor="#ff27282d" android:textSize="16sp" android:textStyle="bold" android:visibility="gone" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="17dp" android:orientation="horizontal"> <include layout="@layout/include_weight_width"/> <TextView android:id="@+id/tv_close" android:layout_width="120dp" android:layout_height="wrap_content" android:background="@drawable/car_get_close" android:gravity="center" android:paddingTop="8dp" android:paddingBottom="8dp" android:text="关闭" android:textColor="@color/main_yellow" android:textSize="16sp" /> <include layout="@layout/include_weight_width"/> <TextView android:id="@+id/tv_sure" android:layout_width="120dp" android:layout_height="wrap_content" android:background="@drawable/car_get_start" android:gravity="center" android:paddingTop="8dp" android:paddingBottom="8dp" android:text="抢单" android:textColor="@color/white" android:textSize="16sp" /> <include layout="@layout/include_weight_width"/> </LinearLayout> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout> app/src/main/res/layout/item_trip_item.xml
@@ -82,7 +82,7 @@ android:layout_height="wrap_content" android:drawableStart="@drawable/bg_point_main_color" android:drawablePadding="3dp" tools:text="柳州市政府" tools:text="射洪出租" android:textColor="#ff27282d" android:textSize="12sp" android:textStyle="bold" /> build.gradle
@@ -3,12 +3,13 @@ buildscript { ext.kotlin_version = '1.3.61' repositories { maven { url 'https://jitpack.io' } google() jcenter() maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } maven { url 'https://maven.aliyun.com/repository/google/' } maven { url 'https://maven.aliyun.com/repository/jcenter/' } // maven { url 'https://maven.aliyun.com/repository/jcenter/' } google() // jcenter() mavenCentral() maven { url 'https://jitpack.io' } } dependencies { @@ -21,15 +22,16 @@ allprojects { repositories { maven { url 'https://jitpack.io' } google() jcenter() maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } maven { url 'https://maven.aliyun.com/repository/google/' } maven { url 'https://maven.aliyun.com/repository/jcenter/' } maven { url 'https://jitpack.io' } maven { url 'https://dl.bintray.com/umsdk/release' } // maven { url 'https://maven.aliyun.com/repository/jcenter/' } google() // jcenter() mavenCentral() maven { url 'https://dl.bintray.com/umsdk/release' } maven { url 'https://jitpack.io' } flatDir { dirs 'libs' }