随着手游行业的蓬勃发展,以及各大IP加入,对于Android手游插件sdk的开发也多了起来。
下面我将给大家分享手游插件的开发细节
1.sdk开发与传统的app开发的不同点
首先做为sdk由于要兼容eclipse开发,sdk里面是没有R文件的(Android studio 可打成aar包里面有R文件,但为了兼容eclipse开发,这里真的想吐槽一下eclipse的ADT工具Google都不更新了,还是有大量游戏使用eclipse开发,也有不少国企和央企开发内部使用的app也是用eclipse开发的,小伙伴们快点使用Android studio开发吧,Android studio是可以直接导入eclipse项目)。
小伙伴就要问没有R文件如何找控件呢,不得不说google还是给我们提供了方法,
下面给大家展示工具类:
/**
* 源文件工具类
*/
public class ResourceUtil {
/**
* 通过上下文找到Resource类
*
* @param paramContext
* @return
*/
public static Resources getResources(Context paramContext) {
return paramContext.getResources();
}
/**
* 通过上下文找到layoutId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getLayoutId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "layout",
paramContext.getPackageName());
}
/**
* 通过上下文找到stringId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getStringId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "string",
paramContext.getPackageName());
}
/**
* 通过上下文找到drawableId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getDrawableId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString,
"drawable", paramContext.getPackageName());
}
/**
* 通过上下文找到StyleId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getStyleId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "style",
paramContext.getPackageName());
}
/**
* 通过上下文找到Id
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "id",
paramContext.getPackageName());
}
/**
* 通过上下文找到colorId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getColorId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "color",
paramContext.getPackageName());
}
/**
* 通过上下文找到arrayId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getArrayId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "array",
paramContext.getPackageName());
}
/**
* 通过上下文找到animId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getAnimId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "anim",
paramContext.getPackageName());
}
/**
* 通过上下文找到dimenId
* @param paramContext 上下文
* @param paramString xml文件名
* @return
*/
public static int getDimenId(Context paramContext, String paramString) {
return getResources(paramContext).getIdentifier(paramString, "dimen",
paramContext.getPackageName());
}
/**
* 进一步封装直接找view
* @param context 上下文
* @param v 父控件
* @param name xml文件名
* @return
*/
public static View findViewByName(Context context, View v, String name) {
return v.findViewById(ResourceUtil.getId(context, name));
}
/**
* 进一步封装直接找到布局的视图
* @param context 上下文
* @param name xml文件名
* @return
*/
public static View inflateViewByXML(Context context, String name) {
return View.inflate(context, ResourceUtil.getLayoutId(context, name), null);
}
}
其次用户在接入sdk时,要将sdk所需要的uses-permission,activity,service,receiver等配置项加入到demo工程的AndroidManifest中去,其中还一项标签也很重要 这个标签是用来读取
后台给用户分配的appId,appKey等数据的,下面就为大家展示demo的AndroidManfest代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.anfan.pay.demo.sdkdemo"
android:versionCode="25"
android:versionName="2.5">
<!-- 需要的权限,请添加到自己工程的清单文件中 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- testing -->
<uses-permission android:name="android.permission.READ_LOGS" />
<!-- 浮动通知生成截图权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!--发送短信的权限-->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 微信支付 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!--NETWORK_PROVIDER-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- GPS-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@drawable/anfan_icon"
android:label="@string/app_name">
<activity
android:name="com.anfan.pay.demo.sdkdemo.GameActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.anfeng.pay.activity.AFClickLogin"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity
android:name="com.anfeng.pay.activity.AFBoundPhone"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
<activity
android:name="com.anfeng.pay.activity.AFLogin"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity
android:name="com.anfeng.pay.activity.AFMissPass"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
<activity
android:name="com.anfeng.pay.activity.AFPayType"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTask"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
<activity
android:name="com.anfeng.pay.activity.AFRegister"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
<!-- 支付宝相关 -->
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden"/>
<activity
android:name="com.alipay.sdk.app.H5AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden"/>
<!-- 银联 -->
<activity
android:name="com.unionpay.uppay.PayActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="true"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" />
<!-- 微信支付 -->
<activity
android:name="com.ipaynow.wechatpay.plugin.inner_plugin.wechat_plugin.activity.WeChatNotifyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Dialog"/>
<service android:name="com.game.alarm.download.DownloadService">
<intent-filter>
<action android:name="download.service.action" />
</intent-filter>
</service>
<!-- 提供给合作方的gameId或appId(应用数字id) 接入时请修改值为在商户后台申请的appid -->
<meta-data android:name="appID" android:value="778" />
<meta-data android:name="appKey" android:value="4c6e0a99384aff934c6e0a99" />
<!-- SDK需要知晓请求的来源 ,即分销商,游戏厂商无须修改 -->
<meta-data android:name="retailer" android:value="255" />
</application>
</manifest>
此时当用户初始化sdk的时候,客户端就能知道是谁接入,这样就能完成与后台的数据交互了,读取meta-data标签的代码:
/**
* 读取meta-data的整型值
* <meta-data android:name="appID" android:value="778" />
* META_DATA_NAME 就是appID ,
* @param context
* @return 就是value的值
*/
private static String metaDataValueOfInter(Context context){
try {
ApplicationInfo applicationInfo = context.getPackageManager().
getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
String valueOfInter=String.valueOf(applicationInfo.metaData.getInt(META_DATA_NAME));
return valueOfInter;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 读取meta-data的字符串
* <meta-data android:name="appKey" android:value="4c6e0a99384aff934c6e0a99" />
* META_DATA_NAME 就是appKey ,
* @param context
* @return 就是value的值
*/
private static String metaDataValueOfString(Context context){
try {
ApplicationInfo applicationInfo = context.getPackageManager().
getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
String valueOfInter=applicationInfo.metaData.getString(META_DATA_NAME);
return valueOfInter;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
今天就先给小伙伴们介绍到这里,欢迎大家给我留言,也可发邮件给
emali:805256509@qq.com