Unity和android之间的通信(adt方式)
一 Unity调用Andorid方法
1.1 这里介绍俩种方法,第一种是直接调用currentActivity,就是当前的Activity。
Unity代码:
/******************* * Title:介入android sdk介入 * Author:CW * ScriptName: SDKForAndrodTest * Des: ******************/ using UnityEngine; using System.Collections; using System.Collections.Generic; public class SDKForAndrodTest : MonoBehaviour { private AndroidJavaClass jc = null; private AndroidJavaObject jo = null; void Awake() { Debug.Log("这里是Unity的Awake"); //得到android里面的类 jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //得到当前的Anorid的Activity对象 jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); } void OnGUI() { if(GUI.Button(new Rect(0,0,100,100),"")) { if(jo!=null) { //test是android里面的方法名称 jo.Call("test", "这是来自Unity的消息"); } } } }
android里面的代码:
新建一个GameMainActivity类继承UnityPlayerActivity,并且重写onCreate方法。
package com.CW.AndroidSDK; import com.unity3d.player.UnityPlayer; import android.graphics.PixelFormat; import android.os.Bundle; import android.text.style.SuperscriptSpan; import android.util.Log; import android.view.Window; public class GameMainActivity extends UnityPlayerActivity { @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //这里是Untiy调用的方法 private void test(String s) { Log.i("unity", "unity 调用了 java 方法:"+s); } }
之后修改AndroidManifest文件,将当前的activity改成GameMainActivity
2 第二种方法是直接调用自己新建的Activity方法(这种我在测试的时候好像只能调用android里面的静态方法)
在adt里面新建一个包和一个类如下:
SDKAPI里面写上Unity要调用的方法。
package com.sdk.api; import android.R.integer; import android.util.Log; public class SDKAPI { private static int test(String s) { Log.i("unity", "unity 调用了 java 方法:"+s); return 0; } }
Unity里面的代码:
/******************* * Title: * Author:CW * ScriptName: SDKForAndrodTest2 * Des: ******************/ using UnityEngine; using System.Collections; using System.Collections.Generic; public class SDKForAndrodTest2 : MonoBehaviour { private AndroidJavaClass jc = null; // Use this for initialization void Start () { //包名.类名 jc = new AndroidJavaClass("com.sdk.api.SDKAPI"); Debug.Log("这里是Unity的Awake"); } void OnGUI() { if (GUI.Button(new Rect(0, 0, 100, 100), "")) { if (jc != null) { jc.CallStatic<int>("test", "这是来自Unity的消息"); } } } private void CallBack(string str) { Debug.Log("这里是Android的回调:" + str); } }
真机调试的时候都打印出出对应的log信息
二 android里面调用Unity的方法
这个很简单,调用UnityPlayer.UnitySendMessage方法就可以了,值得注意的是传参数的时候只能传一个字符串过去。
package com.sdk.api; import org.json.JSONException; import org.json.JSONObject; import com.CW.AndroidSDK3.UnityPlayerActivity; import com.unity3d.player.UnityPlayer; import android.R.integer; import android.util.Log; public class SDKAPI { private static int test(String s) { Log.i("unity", "unity 调用了 java 方法:"+s); JSONObject jsonObject=new JSONObject(); try { jsonObject.put("Key", "这是Android发送给Unity的消息"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } //回调给Unity //第一个参数是游戏物体的名称 //第二个参数是方法名 //第三个参数是发送的消息字符串 UnityPlayer.UnitySendMessage("SDKForAndrodTest", "CallBack", jsonObject.toString()); return 0; } }
打印的Log的信息如下:
三 编写框架实现SDK的接入
1 Untiy端
1.1 抽象出基类
/******************* * Title:SDK接入 * Author:CW * ScriptName: SDKBase * Des:SDK基类 ******************/ using UnityEngine; using System.Collections; using System.Collections.Generic; public class SDKBase { /// <summary> /// 初始化函数 /// </summary> /// <param name="flag"></param> public virtual void Init(int flag=0) { } /// <summary> /// 登入 /// </summary> public virtual void Login() {} /// <summary> /// 登出 /// </summary> public virtual void Logout() { } /// <summary> /// 支付 /// </summary> public virtual void Pay(int num,string orderId ) { } /// <summary> /// 游戏中心 /// </summary> public virtual void GameCenter() { } }
1.2 实现Android的SDK
/******************* * Title:三国无双案例 * Author:CW * ScriptName: SDKForAndroid * Des:接入安卓SDK ******************/ using UnityEngine; using System.Collections; using System.Collections.Generic; public class SDKForAndroid:SDKBase { #if UNITY_ANDROID && !UNITY_EDITOR private AndroidJavaClass _jc; public SDKForAndroid():base() { _jc = new AndroidJavaClass("com.sdk.SDKAPI.SDKAPI"); } public override void Init(int flag = 0) { if(_jc!=null) { _jc.CallStatic("Init",flag); Debug.Log("初始化SDK"); } } public override void Login() { if (_jc != null) { _jc.CallStatic("Login"); } } public override void Logout() { if (_jc != null) { _jc.CallStatic("Logout"); } } public override void Pay(int num,string orderId) { if (_jc != null) { _jc.CallStatic("Pay",num,orderId); } } public override void GameCenter() { if (_jc != null) { _jc.CallStatic("GameCenter"); } } #endif }
1.3管理这些SDK
/******************* * Title:SDK接入 * Author:CW * ScriptName: SDKMgr * Des:SDK管理器 ******************/ using UnityEngine; using System.Collections; using System.Collections.Generic; public class SDKMgr : MonoBehaviour { /// <summary> /// 单利 /// </summary> private static SDKMgr _instance; /// <summary> /// 得到实例 /// </summary> public static SDKMgr Instance { get { if(_instance==null) { GameObject tmpGo = new GameObject("SDKMgr"); _instance = tmpGo.AddComponent<SDKMgr>(); } return _instance; } } private SDKBase _sdkAPI; void Awake() { #if UNITY_EDITOR _sdkAPI = new SDKBase(); #elif UNITY_ANDROID Debug.Log("Awake"); _sdkAPI = new SDKForAndroid(); #endif } /// <summary> /// 初始化函数 /// </summary> /// <param name="flag"></param> public void Init(int flag = 0) { _sdkAPI.Init(flag); } /// <summary> /// 登入 /// </summary> public void Login(LoginListener listener) { _currentListner = listener; _sdkAPI.Login(); } /// <summary> /// 登出 /// </summary> public void Logout() { _sdkAPI.Logout(); } /// <summary> /// 支付 /// </summary> public void Pay(PayData payData) { CurrentPayData = payData; _sdkAPI.Pay(CurrentPayData.Num,CurrentPayData.OrderID); } /// <summary> /// 游戏中心 /// </summary> public void GameCenter() { _sdkAPI.GameCenter(); } public PayData CurrentPayData; /// <summary> /// 支付数据 /// </summary> public class PayData { /// <summary> /// 支付数量 /// </summary> public int Num; /// <summary> /// 订单号 /// </summary> public string OrderID; public PayData(int num,string orderId) { Num=num; OrderID=orderId; } } private LoginListener _currentListner; public interface LoginListener { void OnSucess(string uid); void OnFail(); void OnCancel(); } #region Android回调Unity private void LogicCallBack(string jsonObj) { if(string.IsNullOrEmpty(jsonObj)) { if(_currentListner!=null) { _currentListner.OnFail(); } else { Debug.LogError("_currentListner is null"); } } else if(jsonObj.Equals("-1")) { if (_currentListner != null) { _currentListner.OnCancel(); } else { Debug.LogError("_currentListner is null"); } } else { if (_currentListner != null) { _currentListner.OnSucess(jsonObj); } else { Debug.LogError("_currentListner is null"); } } } #endregion }
1.4 Unity端的测试脚本
/******************* * Title:三国无双案例 * Author:CW * ScriptName: SDKTest * Des: ******************/ using UnityEngine; using System.Collections; using System.Collections.Generic; public class SDKTest : MonoBehaviour { void OnGUI() { if(GUI.Button(new Rect(0,0,100,50),"Init")) { SDKMgr.Instance.Init(); }else if(GUI.Button(new Rect(0,60,100,50),"Login")) { SDKMgr.Instance.Login(new LoginCallBack()); } else if (GUI.Button(new Rect(0, 120, 100, 50), "Logout")) { SDKMgr.Instance.Logout(); } else if (GUI.Button(new Rect(0, 190, 100, 50), "Pay")) { SDKMgr.Instance.Pay(new SDKMgr.PayData(5,"测试订单ID")); } else if (GUI.Button(new Rect(0, 270, 100, 50), "GameCenter")) { SDKMgr.Instance.GameCenter(); } } public class LoginCallBack:SDKMgr.LoginListener { public void OnSucess(string uid) { Debug.Log("登录成功:"+uid); } public void OnFail() { Debug.Log("登录失败"); } public void OnCancel() { Debug.Log("取消登录"); } } }
2 ADT方面的代码(以接入百度SDK为例,详细的接入百度SDK步骤可以看百度SDK的接入文档,这里只说明接入的流程)
2.1 把untiy的工程导出Android工程(不会百度一下就出来了),然后创建出负责和adt通信的包和类名,并且导入百度SDK的库文件。我的目录结构如下:
2.2将我们的项目去引用这个库文件
2.3下面我们编写SDKAPI这个类,代码如下:
package com.sdk.SDKAPI; import android.R.integer; import com.CW.AndroidSDK.MainActivity; /*这里的方法要和Unity里面的要对应 * */ public class SDKAPI { /* * SDK初始化 * */ public static void Init(int flag) { MainActivity.myHandler.sendEmptyMessage(SDKUtility.E_SDKFunType.INIT.ordinal()); } /* * 登入 * */ public static void Login() { MainActivity.myHandler.sendEmptyMessage(SDKUtility.E_SDKFunType.LOGIN.ordinal()); } /* * 登出 * */ public static void Logout() { MainActivity.myHandler.sendEmptyMessage(SDKUtility.E_SDKFunType.LOGOUT.ordinal()); } public static PayData currPayData; /* * 支付 * */ public static void Pay(int num,String orderId) { currPayData=new PayData(num,orderId); MainActivity.myHandler.sendEmptyMessage(SDKUtility.E_SDKFunType.PAY.ordinal()); } /* * 游戏中心 * */ public static void GameCenter() { MainActivity.myHandler.sendEmptyMessage(SDKUtility.E_SDKFunType.GAMECENTER.ordinal()); } /* * 支付数据 * */ public static class PayData { /*金币分 * */ public int num; /*订单号 * */ public String orderIdString; public PayData(int num,String orderId) { this.num=num; this.orderIdString=orderId; } } }
2.4编写MainActivity,这个类必须继承UnityPlayerActivity并且重写onCreate方法。(这样做是百度SDK文档要求的)
这个类主要的作用去调用百度SDK里面的库文件,所以有些方法是文档里面要求的。而我们的SDKAPI类就是去调用这个类里面的一些方法,从而实现交互,下面是这个类的主要代码:
package com.CW.AndroidSDK; import java.util.UUID; import android.R.string; import android.app.Activity; import android.graphics.PixelFormat; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.Window; import android.widget.Toast; import com.baidu.gamesdk.ActivityAdPage; import com.baidu.gamesdk.ActivityAdPage.Listener; import com.baidu.gamesdk.ActivityAnalytics; import com.baidu.gamesdk.BDGameSDK; import com.baidu.gamesdk.BDGameSDKSetting; import com.baidu.gamesdk.BDGameSDKSetting.Domain; import com.baidu.gamesdk.IResponse; import com.baidu.gamesdk.ResultCode; import com.baidu.platformsdk.PayOrderInfo; import com.sdk.SDKAPI.SDKAPI; import com.sdk.SDKAPI.SDKUtility; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { public static Activity CurrentActivity; public static MyHandler myHandler;//百度SDK private ActivityAnalytics mActivityAnalytics;//百度SDK private ActivityAdPage mActivityAdPage; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); CurrentActivity=this; mActivityAnalytics = new ActivityAnalytics(this); mActivityAdPage = new ActivityAdPage(this, new Listener(){ @Override public void onClose() { //TODO 关闭暂停页面,CP可以让玩家继续玩游戏 Toast.makeText(getApplicationContext(), "继续游戏", Toast.LENGTH_LONG).show(); } }); myHandler=new MyHandler(); } @Override protected void onDestroy() { BDGameSDK.destroy(); mUnityPlayer.quit(); super.onDestroy(); } @Override protected void onResume() { super.onResume(); mActivityAdPage.onResume(); mActivityAnalytics.onResume(); } @Override protected void onStop() { super.onStop(); mActivityAdPage.onStop(); } @Override protected void onPause() { super.onPause(); mActivityAdPage.onPause(); mActivityAnalytics.onPause(); } @Override public void finish() { // TODO Auto-generated method stub super.finish(); BDGameSDK.closeFloatView(this);//关掉悬浮框 } public class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper L) { super(L); } /* * 子类必须重写该方法,接受该消息 * */ @Override public void handleMessage(Message msg) { if(msg.what==SDKUtility.E_SDKFunType.INIT.ordinal()) { initBDGameSDK(); Log.i("Unity", "调用了SDK初始化方法"); }else if(msg.what==SDKUtility.E_SDKFunType.LOGIN.ordinal()) { BDSDKLogic(); Log.i("Unity", "调用了SDK登入方法"); }else if(msg.what==SDKUtility.E_SDKFunType.LOGOUT.ordinal()) { BDSDKLogOut(); Log.i("Unity", "调用了SDK登出方法"); }else if(msg.what==SDKUtility.E_SDKFunType.PAY.ordinal()) { BDSDKPay(SDKAPI.currPayData.num,SDKAPI.currPayData.orderIdString); Log.i("Unity", "调用了SDK支付方法"); }else if(msg.what==SDKUtility.E_SDKFunType.GAMECENTER.ordinal()) { Log.i("Unity", "调用了SDK游戏中心方法"); } super.handleMessage(msg); Log.i("Unity", "-----"); } } /*public static Handler MyHandler =new Handler() { public void handleMessage(Message msg) { if(msg.what==SDKUtility.E_SDKFunType.INIT.ordinal()) { Log.i("Unity", "调用了SDK初始化方法"); }else if(msg.what==SDKUtility.E_SDKFunType.LOGIN.ordinal()) { Log.i("Unity", "调用了SDK登入方法"); }else if(msg.what==SDKUtility.E_SDKFunType.LOGOUT.ordinal()) { Log.i("Unity", "调用了SDK登出方法"); }else if(msg.what==SDKUtility.E_SDKFunType.PAY.ordinal()) { Log.i("Unity", "调用了SDK支付方法"); }else if(msg.what==SDKUtility.E_SDKFunType.GAMECENTER.ordinal()) { Log.i("Unity", "调用了SDK游戏中心方法"); } super.handleMessage(msg); Log.i("Unity", "-----"); } };*/ private void setSuspendWindowChangeAccountListener(){//设置切换账号事件监听(个人中心界面切换中心) BDGameSDK.setSuspendWindowChangeAccountListener(new IResponse<Void>(){ @Override public void onResponse(int resultCode, String resultDesc, Void extraData) { switch(resultCode){ case ResultCode.LOGIN_SUCCESS: //TODO 登录成功,不管之前是什么情况,游戏内都要切换成新的用户 //返回主界面,重新刷新 Toast.makeText(getApplicationContext(), "鐧诲綍鎴愬姛", Toast.LENGTH_LONG).show(); break; case ResultCode.LOGIN_FAIL: //TODO 登录失败,游戏内部之前如果是已经被登录的,要清楚自己记录的登录状态,设置成未登录。如果之前为登录,不用处理 Toast.makeText(getApplicationContext(), "鐧诲綍澶辫触", Toast.LENGTH_LONG).show(); break; case ResultCode.LOGIN_CANCEL: //TODO 取消,操作前后的登录状态没变换 break; } } }); } /* * 初始化SDK * */ private void initBDGameSDK() { BDGameSDKSetting mBDGameSDKSetting = new BDGameSDKSetting(); mBDGameSDKSetting.setAppID(3067515);//APPID mBDGameSDKSetting.setAppKey("f3Os4GAOqxgm79GqbnkT9L8T");//APPKEY mBDGameSDKSetting.setDomain(Domain.DEBUG);// mBDGameSDKSetting.setOrientation(BDGameSDKSetting.Orientation.PORTRAIT); BDGameSDK.init(this, mBDGameSDKSetting, new IResponse<Void>(){ @Override public void onResponse(int resultCode, String resultDesc, Void extraData) { switch(resultCode){ case ResultCode.INIT_SUCCESS: //初始化成功 break; case ResultCode.INIT_FAIL: //初始化失败 default: Toast.makeText(CurrentActivity, "启动失败", Toast.LENGTH_LONG).show(); finish(); } } }); } /* * 登录 * */ public void BDSDKLogic() { BDGameSDK.login(new IResponse<Void>() { @Override public void onResponse(int resultCode, String resultDesc, Void extraData) { Log.d("login", "this resultCode is " + resultCode); String hint = ""; switch(resultCode){ case ResultCode.LOGIN_SUCCESS: hint="登录成功"; //拿到用户ID String uid= BDGameSDK.getLoginUid(); //UnityPlayer.UnitySendMessage("SDKMgr", "BDLoginCallBack", uid); SDKUtility.SendMsgToUnity(SDKUtility.CallBackFunName.LOGINCALLBACK_STRING, uid); //显示悬浮按钮 BDGameSDK.showFloatView(CurrentActivity); //切换账号 setSuspendWindowChangeAccountListener(); break; case ResultCode.LOGIN_CANCEL: SDKUtility.SendMsgToUnity(SDKUtility.CallBackFunName.LOGINCALLBACK_STRING, "-1"); hint="取消登录"; break; case ResultCode.LOGIN_FAIL: SDKUtility.SendMsgToUnity(SDKUtility.CallBackFunName.LOGINCALLBACK_STRING, ""); hint="登录失败"; default: SDKUtility.SendMsgToUnity(SDKUtility.CallBackFunName.LOGINCALLBACK_STRING, ""); hint="登录失败"; } Toast.makeText(getApplicationContext(), hint, Toast.LENGTH_LONG).show(); } }); } /* * 登出 * */ public void BDSDKLogOut() { BDGameSDK.logout(); } /*支付(定额支付) * */ public void BDSDKPay(int num,String oderId) { PayOrderInfo payOrderInfo = buildOrderInfo(num,oderId); if(payOrderInfo == null){ return; } BDGameSDK.pay(payOrderInfo, null, new IResponse<PayOrderInfo>(){ @Override public void onResponse(int resultCode, String resultDesc, PayOrderInfo extraData) { String resultStr = ""; switch(resultCode){ case ResultCode.PAY_SUCCESS: resultStr = "支付成功:" + resultDesc; break; case ResultCode.PAY_CANCEL: resultStr = "取消支付"; break; case ResultCode.PAY_FAIL: resultStr = "支付失败" + resultDesc; break; case ResultCode.PAY_SUBMIT_ORDER: resultStr ="支付失败"; break; } Toast.makeText(getApplicationContext(), resultStr, Toast.LENGTH_LONG).show(); } }); } /* * 构建订单信息 * 总金额 * 订单号 * */ public PayOrderInfo buildOrderInfo(int amount,String oderId){ String cpOrderId = UUID.randomUUID().toString();// String goodsName = "金币"; String totalAmount = String.valueOf(amount); int ratio = 1; String extInfo = oderId; if(TextUtils.isEmpty(totalAmount)){ totalAmount = "0"; } PayOrderInfo payOrderInfo = new PayOrderInfo(); payOrderInfo.setCooperatorOrderSerial(cpOrderId); payOrderInfo.setProductName(goodsName); long p = Long.parseLong(totalAmount); payOrderInfo.setTotalPriceCent(p); payOrderInfo.setRatio(ratio); payOrderInfo.setExtInfo(extInfo); return payOrderInfo; } }
注意我们要修改manifest文件。将Application里面的Android:name 改成
android:name="com.CW.BaiDuSDKPro1.GameApplication"
Application里面的Activity:name改成:
android:name="com.CW.AndroidSDK.MainActivity"
除了这些之外还有一些service和uses-permission还有其他的acrivity按照百度SDK的文档要求全部复制进去
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.CW.BaiDuSDKPro1" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="true" android:banner="@drawable/app_banner" android:name="com.CW.BaiDuSDKPro1.GameApplication"> <activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:name="com.CW.AndroidSDK.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <!-- ↓↓↓ SDK ↓↓↓ --> <!-- 0-百度 1-多酷 2-91 --> <meta-data android:name="BDPlatformType" android:value="0" /> <meta-data android:name="BDGameVersion" android:value="3.2.0" /> <activity android:name="com.baidu.platformsdk.LoginActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:excludeFromRecents="true" android:theme="@style/bdp_dialog_style_fullscreen"/> <activity android:name="com.baidu.platformsdk.AssistActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:excludeFromRecents="true" android:theme="@style/bdp_dialog_style_fullscreen"/> <activity android:name="com.baidu.platformsdk.BindPhoneActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:excludeFromRecents="true" android:theme="@style/bdp_dialog_style_fullscreen"/> <activity android:name="com.baidu.platformsdk.CashierDeskActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:theme="@style/bdp_dialog_style_fullscreen" android:windowSoftInputMode="adjustPan"/> <activity android:name="com.baidu.platformsdk.WebActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="adjustPan"/> <activity android:name="com.baidu.platformsdk.ModifyPasswordActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:excludeFromRecents="true" android:theme="@style/bdp_dialog_style_fullscreen"/> <activity android:name="com.baidu.platformsdk.ThirdPartyLoginActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:excludeFromRecents="true" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:exported="false"/> <activity android:name="com.baidu.platformsdk.VisitorBindActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:excludeFromRecents="true" android:theme="@style/bdp_dialog_style_fullscreen"/> <activity android:name="com.baidu.platformsdk.BaiduBeanDetailActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:windowSoftInputMode="adjustPan" android:theme="@style/bdp_dialog_style_fullscreen" /> <activity android:name="com.baidu.platformsdk.OrderDetailActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:windowSoftInputMode="adjustPan" android:theme="@style/bdp_dialog_style_fullscreen" /> <activity android:name="com.baidu.platformsdk.SapiWebActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:windowSoftInputMode="adjustPan" android:theme="@style/bdp_dialog_style_fullscreen" /> <activity android:name="com.baidu.platformsdk.SapiLoginProxyActivity" android:configChanges="orientation|navigation|screenSize|keyboard|keyboardHidden" android:exported="false" android:windowSoftInputMode="adjustPan" android:theme="@style/bdp_dialog_style_fullscreen" /> <service android:name="com.baidu.platformsdk.BDPlatformService" android:exported="false" /> <!-- ↑↑↑ SDK ↑↑↑ --> <!-- ↓↓↓ 百度钱包 ↓↓↓ --> <activity android:name="com.baidu.android.pay.ui.WelcomeActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivityWelcome" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.PayResultActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" > </activity> <activity android:name="com.baidu.android.pay.ui.PwdCheckActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateVisible" > </activity> <activity android:name="com.baidu.android.pay.ui.PwdSetActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateVisible" > </activity> <activity android:name="com.baidu.android.pay.ui.PwdConfirmActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateVisible" > </activity> <activity android:name="com.baidu.android.pay.ui.PwdPayActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivitTranslucent" android:windowSoftInputMode="stateVisible" /> <activity android:name="com.baidu.android.pay.ui.PwdPaySmsActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivitTranslucent" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.WebViewActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" > </activity> <activity android:name="com.baidu.android.pay.ui.BindFirstActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="adjustResize" /> <activity android:name="com.baidu.android.pay.ui.BindSecondActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.BindSecondCreditAcitvity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.BindSecondCredit2Activity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.BindThirdActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="adjustResize" /> <activity android:name="com.baidu.android.pay.ui.SelectBindCardActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.LoginActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.PassNormalizeActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" /> <activity android:name="com.baidu.android.pay.ui.OrderHomeActivity" android:configChanges="keyboardHidden|navigation|orientation|screenSize" android:excludeFromRecents="true" android:exported="false" android:theme="@style/EbpayThemeActivit" android:windowSoftInputMode="stateHidden" /> <!-- ↑↑↑ 百度钱包 ↑↑↑ --> <!-- ↓↓↓ passport ↓↓↓ --> <activity android:name="com.baidu.sapi2.utils.LoginProtectAcitivity" android:screenOrientation="portrait" android:theme="@style/bdp_SapiTheme" android:windowSoftInputMode="adjustPan" /> <!-- ↑↑↑ passport ↑↑↑ --> <!-- ↓↓↓ 银联SDK ↓↓↓ --> <activity android:name="com.unionpay.uppay.PayActivity" android:screenOrientation="landscape" /> <!-- ↑↑↑ 银联SDK ↑↑↑ --> <!-- ↓↓↓ 支付宝插件 ↓↓↓ --> <activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" /> <activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" /> <!-- ↑↑↑ 支付宝插件 ↑↑↑ --> <!-- ↓↓↓ 多酷SDK ↓↓↓ --> <activity android:name="com.duoku.platform.ui.DKContainerActivity" android:configChanges="orientation|keyboardHidden|navigation|screenSize" android:launchMode="singleTop" android:theme="@style/StyledIndicators" > </activity> <service android:name="com.duoku.platform.service.DKSuspensionService" /> <!-- 贴吧 start --> <activity android:name="com.baidu.tiebasdk.ext.motu.SelectBarActivity" android:configChanges="orientation|keyboardHidden|navigation" /> <activity android:name="com.baidu.tiebasdk.account.InputUserNameActivity" android:configChanges="orientation|keyboardHidden|navigation" android:theme="@android:style/Theme.Translucent.NoTitleBar" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.account.LoginActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.account.Register2Activity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.account.ActivationActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.account.ProtocolActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.frs.FrsActivity" android:configChanges="orientation|keyboardHidden|navigation" > </activity> <activity android:name="com.baidu.tiebasdk.frs.FrsImageActivity" android:configChanges="orientation|keyboardHidden|navigation" > </activity> <activity android:name="com.baidu.tiebasdk.mention.MentionActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.mention.ReplyMeActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.mention.AtMeActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.pb.NewPbActivity" android:configChanges="orientation|keyboardHidden|navigation" android:windowSoftInputMode="adjustResize|stateHidden" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.pb.ImagePbActivity" android:configChanges="orientation|keyboardHidden|navigation" android:windowSoftInputMode="adjustResize" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.write.WriteActivity" android:configChanges="orientation|keyboardHidden|navigation" android:windowSoftInputMode="stateVisible|adjustResize" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.write.VcodeActivity" android:configChanges="orientation|keyboardHidden|navigation" android:windowSoftInputMode="stateVisible|adjustResize" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.write.NewVcodeActivity" android:configChanges="orientation|keyboardHidden|navigation" android:windowSoftInputMode="stateHidden" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.write.AtListActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.write.WriteImageActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.pb.ImageActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.pb.WebActivity" android:configChanges="orientation|keyboardHidden|navigation" > <intent-filter> </intent-filter> </activity> <activity android:name="com.baidu.tiebasdk.more.AccountActivity" > <intent-filter> </intent-filter> </activity> <!-- 贴吧activity end --> <!-- 贴吧 service begin --> <service android:name="com.baidu.tiebasdk.service.TiebaUpdateService" android:enabled="true" > <intent-filter> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <service android:name="com.baidu.tiebasdk.service.TiebaFullUpdateService" android:enabled="true" > <intent-filter> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <service android:name="com.baidu.tiebasdk.service.ClearTempService" android:enabled="true" > <intent-filter> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <service android:name="com.baidu.tiebasdk.service.FatalErrorService" android:enabled="true" > <intent-filter> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <service android:name="com.baidu.tiebasdk.service.TiebaSyncService" android:enabled="true" > <intent-filter> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <service android:name="com.baidu.tiebasdk.service.TiebaMessageService" android:enabled="true" > <intent-filter> <action android:name="com.baidu.tiebasdk.service.Message" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <service android:name="com.baidu.tiebasdk.service.TiebaPrepareImageService" android:enabled="true" > <intent-filter> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <!-- 贴吧 service end --> <!-- push service client --> <receiver android:name="com.duoku.platform.push.MyReceiver" > <intent-filter> <action android:name="com.duoku" /> </intent-filter> </receiver> <receiver android:name="com.duoku.platform.push.PushMessageReceiver" > <intent-filter> <!-- 接收push消息 --> <action android:name="com.baidu.android.pushservice.action.MESSAGE" /> <!-- 接收bind,unbind,fetch,delete等反馈消息 --> <action android:name="com.baidu.android.pushservice.action.RECEIVE" /> <action android:name="com.baidu.android.pushservice.action.notification.CLICK" /> </intent-filter> </receiver> <receiver android:name="com.baidu.android.pushservice.PushServiceReceiver" android:process=":bdservice_v1" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="com.baidu.android.pushservice.action.notification.SHOW" /> <action android:name="com.baidu.android.pushservice.action.media.CLICK" /> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <action android:name="android.intent.action.USER_PRESENT" /> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> </receiver> <receiver android:name="com.baidu.android.pushservice.RegistrationReceiver" android:process=":bdservice_v1" > <intent-filter> <action android:name="com.baidu.android.pushservice.action.METHOD" /> <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <data android:scheme="package" /> </intent-filter> </receiver> <service android:name="com.baidu.android.pushservice.PushService" android:exported="true" android:process=":bdservice_v1" > <intent-filter> <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" /> </intent-filter> </service> <service android:name="com.baidu.android.pushservice.CommandService" android:exported="true" /> <!-- push service end --> <!-- 贴吧 receiver start --> <receiver android:name="com.baidu.tiebasdk.service.TiebaReceiver" > <intent-filter> <action android:name="com.baidu.tiebasdk.broadcast.service" /> <action android:name="com.baidu.tiebasdk.broadcast.sync" /> </intent-filter> </receiver> <receiver android:name="com.baidu.tiebasdk.service.InstallReceiver" > <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <data android:scheme="package" /> </intent-filter> </receiver> <receiver android:name="com.baidu.tiebasdk.service.SyncLoginReceiverForAs" > <intent-filter> <action android:name="com.baidu.tiebasdk.broadcast.syncLoginFromAS" /> </intent-filter> </receiver> <!-- 贴吧 receiver end --> <!-- ↑↑↑ 多酷SDK ↑↑↑ --> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="21" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> <!-- ↓↓↓ SDK ↓↓↓ --> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- ↑↑↑ SDK ↑↑↑ --> <!-- ↓↓↓ DK SDK ↓↓↓ --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.CALL_PHONE" /> </manifest>
测试运行的界面如下: