关于google play ,facebook ,amazon SDK集成的经历
来源:互联网 发布:wow7.0前夕插件mac 编辑:程序博客网 时间:2024/05/21 10:29
最近搞了google play ,facebook ,amazon,集成他们的sdk,搞完的时候就会觉得不是非常难,没搞完时就会头大,掉坑多的就是没能完全搞明白人家到底是怎么运作的,人家官方上的文档没能完全搞懂。
必要条件就是要国外的网络,大家都知道国内对这个是禁止了,什么VPN,翻墙之类的,这个之前我确实没搞过,翻墙也不会翻,别喷,我确实没翻过墙,好在老板的用那个路由可设置香港网络,直接连过去,省了不少事,还有手机是包含google服务框架的,google商店,国内的大多手机已经被移除这个,重刷或者去百度怎么装上吧,这些都是基本坑了,从0开始的人就慢慢折腾吧。
1。首先说google play, 在SDK的目录下找到sdk\extras\google\google_play_services,他是一个依赖工程,或者在eclipse中下载,并且导入到工程依赖,致于代码部份,网有好多,基本上都相同,google也提供有例子,或者找这里,我也是在网上看他们写的注解,他们写得也详细
http://blog.csdn.net/change_from_now/article/details/36668017
http://blog.csdn.net/midashao/article/details/10122333
我的在消耗和非消耗这两个搞得不是非常明白,按那说是消耗品在收到支付成功已经用了之后是需要告诉google你已经用了这个商品的,不然下次购买时就买不了同一件商品,非消耗,也就是一次性购买的是不需要执行告之消耗的,但我测试时就遇到个问题,我的商品设置障是一次性购买的,我安上买了一个商品,后来卸掉了,又安了一次,可这时我的那件商品没有了,初始化执行查找那步查不到我所拥有的商品,再购买时又是失败的,无法购买,这点让人比较蛋疼,这个是在自测时发现,发邮件问google如何才能查到已经有的商品,回复是测试时必须是经过后台分配的那个测试下载连接,用手机去下下来测,我试过也不行,还是查不到,返回还是失败,网上有人说他的情况连获取自己这让人比较担心,玩家要是换了设备或者卸掉重装,那个商品不能买又不得用,由于是单机游戏,没有服务端去存储这些,有哪位知道麻烦告诉我要怎么获取我已经购买了的商品(我用的是queryInventoryAsync方法查一次购买的商品,据网友说他买那种消耗性的在后支付成功后并不执行consumeAsync,然后退出再进来重查是能查到他的商品)
用官方的demo,复制那些文件时,支付可能会遇到一个情况,就是说有一个任务进在执行,不能支付,这点搞了我好久,马蛋,也怪自己没有认真去看人家google提供的源码,后来找到一个外国人说的:http://stackoverflow.com/questions/15575605/android-in-app-billing-cant-start-async-operation-because-another-async-operat
before calling purchaseItem method just add this line
if (billingHelper != null) billingHelper.flagEndAsync();
so your code looks this way
if (billingHelper != null) billingHelper.flagEndAsync(); purchaseItem("android.test.purchased");
Note: don't forget to make public flagEndAsync() method in IabHelper if you call it from another package设置测试为开放测试,设置封闭测试不知为何在商店上找不到,还有半于cocos2D的openssl安全问题,会收到ggogle的警告,这个要重视,不然他先警告,后面直接把应用给下了,解决这个openssl问题,这里是照人家的改的http://www.bubuko.com/infodetail-1063060.html
2。facebook在sharesdk上分享时,其分享不支持客客户端直接分享,只能通过网页分享,要在后台把网页,web登录权限打开才行,不然会显示未登录却又没有其他按钮可以点,facebook的登录比较特别,用Fragment来执行,登录时必须要以用后台填写的hash值,所以调试时先后台把hash改为测试环境的,正式发布的包,导出后去后台把那个hash改成正式的,不然就会看到登录说你的hash值不对,具体生成hash在facebook官网那有步骤一个一个地说明,用的是4.5API,SDK的要求是要21或以上,环境问题就不多说了,没搞对的,掉坑还是得慢慢爬,我搞的只是其中一个接口,其他的接口可以进facebook的群,这个340348340,这里面有android和IOS的老鸟和新鸟,可以去问问他们是怎么搞的
引facebook的包,登录的xml文件中加入
<com.facebook.login.widget.LoginButton
android:id="@+id/loginBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
以下这个是主类,有个别是多余的,还包含了分享的代码:
public class MainFragment extends Fragment
{
private static final String TAG = "MainFragment";
private CallbackManager callbackManager;
private Activity activity;
private TextView showmsg;
private Button payTest,shareBtn,faceShareBtn;
private LoginButton loginBtn;
private EditText payid;
private PtGooglePlayServer gpServer;
private PtFaceBookServer fbServer;
private ShareDialog shareDialog;
private String msgStr;
private static final int SHARE_RESULT=0;
private static final int SHARE_HELP =1;
public MainFragment(Activity activity)
{
this.activity=activity;
callbackManager=CallbackManager.Factory.create();
gpServer=PtGooglePlayServer.getInstance(activity);
fbServer=PtFaceBookServer.getInstance(activity);
fbServer.initFaceBook();
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.activity_main, container, false);
view.setVisibility(View.VISIBLE);//要是不想看到这个界面,就设为gone
initView(view);
setOnClickListen();
loginBtn.performClick(); //自动点击登录
loginBtn.setVisibility(View.VISIBLE);//要是不想看到这个按钮,就设为gone
//getSign();
return view;
}
private void setOnClickListen()
{
loginBtn.setReadPermissions(Arrays.asList("email","user_likes","public_profile","user_friends")); //注意API版本说明,在后台那有,如果所用的版本不支持的,获取多了,程序会挂
loginBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>()
{
@Override
public void onSuccess(LoginResult result)
{
LogUtil.i(TAG, "login success");
}
@Override
public void onError(FacebookException error)
{
LogUtil.i(TAG, "login error");
}
@Override
public void onCancel()
{
LogUtil.i(TAG, "login onCancel");
}
});
shareDialog=new ShareDialog(activity);
shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>()
{
@Override
public void onError(FacebookException error)
{
}
@Override
public void onCancel()
{
}
@Override
public void onSuccess(Sharer.Result result)
{
}
});
}
private void initView(View view)
{
showmsg=(TextView) view.findViewById(R.id.showmsg);
payTest=(Button) view.findViewById(R.id.payTest);
loginBtn=(LoginButton) view.findViewById(R.id.loginBtn);
shareBtn=(Button) view.findViewById(R.id.shareBtn);
payid=(EditText) view.findViewById(R.id.payid);
faceShareBtn=(Button) view.findViewById(R.id.faceShareBtn);
}
@Override
public void onResume()
{
LogUtil.i(TAG, "Farg onResume");
super.onResume();
PtFaceBookServer.getInstance(activity).onSdkResume();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
LogUtil.i(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
callbackManager.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onPause()
{
LogUtil.i(TAG, "Farg onPause");
super.onPause();
PtFaceBookServer.getInstance(activity).onSdkPause();
}
@Override
public void onDestroy()
{
Log.i(TAG, "Farg onDestroy");
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
}
/**分享**/
private void startShare(int type)
{
if(SHARE_RESULT==type)
{
String title="my DemonTower result 565";
String msg="I spent 4 hours in customs clearance.Test again"+ToolUtil.getRandom(2);//每次内容要不一样,不然会失败
//String imgUrl="https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xaf1/t39.2178-6/11057106_610131042456334_1908341011_n.png";
String imgUrl="https://scontent.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/p720x720/12193774_525203350979975_5840727425341442755_n.png?oh=fc25860e29855b7ef21d0811b765480e&oe=56AC7B92";
ShareUtil.shareMyResult(activity, title, msg, imgUrl);
}
//facebook
if(ShareDialog.canShow(ShareLinkContent.class) && SHARE_HELP==type)
{
//这里要填网络地址
Uri imageUrl=Uri.parse("https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xaf1/t39.2178-6/11057106_610131042456334_1908341011_n.png");
ShareLinkContent linkContent = new ShareLinkContent.Builder()
.setContentTitle("Hello Facebook")//标题
.setContentDescription("The 'Hello Facebook' sample showcases simple Facebook integration")//填写简介
.setContentUrl(Uri.parse("http://developers.facebook.com/android"))//点击时指向地址
.setImageUrl(imageUrl)
.build();
shareDialog.show(linkContent);
}
}
/**获取hash**/
private void getSign()
{
try
{
PackageInfo info = activity.getPackageManager().getPackageInfo("com.pt.dot", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures)
{
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String str=Base64.encodeToString(md.digest(), Base64.DEFAULT);
LogUtil.e(TAG, str);
msgStr=str;
handler.sendEmptyMessage(1008);
}
} catch (NameNotFoundException e)
{
} catch (NoSuchAlgorithmException e) {
}
}
}
调用的地方:
private MainFragment mainFragment;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (savedInstanceState == null)
{
// Add the fragment on initial activity setup add(android.R.id.content, mainFragment).commit();
mainFragment = new MainFragment(activity);
android.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().add(android.R.id.content, mainFragment).commit();
} else
{
// Or set the fragment from restored state info
android.app.FragmentManager fragmentManager = getFragmentManager();
mainFragment = (MainFragment)fragmentManager.findFragmentById(android.R.id.content);
}
}
3。amazon支付测试要在他的商店上下载App Tester,然后在后台下载那个商品的json文件并且放到sd卡下,然后进行测试,关于一次性购买在玩家再次支付时,如果已经买过,会有返回已经买过的标记,不同的API版本要看具体返回什么标记,看官方提供的实例就行,生成API KEY,必须要在后台那填写配置安全文件,这个过程在官方文档那有写的,而且必须要填写签名,按照步骤完成后台会显示这个apikey,可以生成多个,可用于开发环境和正式环境,发布正式版导出包时不要忘记改回来就行
最后总结:第一次搞外国平台的东西,英语不好确实比较麻烦,还好部份可看中文,但翻译的有点掉爹,意思会变味,只能靠猜和意测,人家有提供源码的最好还是得看下,至少看下人家调用的方法的注释,走了很多弯路,掉了不少坑,其实大多都是自己挖的坑,也就浪费了好多时间,时区的差异,发邮件给平台也是一天后才得回复,不像国内平台,大多数有技术支持。这几个平台的后台管理都是做得非常细的,客户端代码没多少事,多数都为后台没搞对而耽搁,看懂基本流程知道大概再动手,细节问题掉坑再爬。
- 关于google play ,facebook ,amazon SDK集成的经历
- android集成amazon的相关sdk
- 【Android】google plus、Facebook登陆sdk集成打包出aar的使用步骤
- Google Play services SDK的安装
- Google Play services SDK的安装
- Google Play Services SDK
- 关于在Android游戏中集成Google Play游戏服务
- Google, FaceBook, Amazon 加州求职记
- 关于下载google play上的apk
- 由Unity發佈到Google Play (Android Market)和Amazon App Store (Kindle Fire)的步驟
- Android Studio集成Facebook SDK
- 六大生态系统的崛起:Apple、Google、Amazon、Microsoft、Facebook和Sony
- (转)Apple、Google、Microsoft、Facebook、Amazon、Sony六大生态系统的崛起
- 来自Google、Amazon和Facebook等7大知名互联网的系统扩展经验
- 来自Google、Amazon和Facebook等7大知名互联网的系统扩展经验
- 来自Google、Amazon和Facebook等7大知名互联网的系统扩展经验
- 来自Google、Amazon和Facebook等7大知名互联网的系统扩展经验
- 来自Google、Amazon和Facebook等7大知名互联网的系统扩展经验
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- 6个Linux chkconfig命令实例 - 增加,删除,查看和修改services的自动启动选项
- Activity启动模式总结
- 面向过程设计和面向对象设计之间区别的实例
- editplus快捷键大全
- 关于google play ,facebook ,amazon SDK集成的经历
- 黑马程序员——网络编程
- 【JQuery】write less,do more
- pycharm4.5.1 注册码 破解
- 谈谈我自己(创业四个多月)
- Rails接口(interface)入门
- html头部
- gvim配置及相关插件安装(过程详细,附图)
- Handler 刷新