关于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,可以生成多个,可用于开发环境和正式环境,发布正式版导出包时不要忘记改回来就行


最后总结:第一次搞外国平台的东西,英语不好确实比较麻烦,还好部份可看中文,但翻译的有点掉爹,意思会变味,只能靠猜和意测,人家有提供源码的最好还是得看下,至少看下人家调用的方法的注释,走了很多弯路,掉了不少坑,其实大多都是自己挖的坑,也就浪费了好多时间,时区的差异,发邮件给平台也是一天后才得回复,不像国内平台,大多数有技术支持。这几个平台的后台管理都是做得非常细的,客户端代码没多少事,多数都为后台没搞对而耽搁,看懂基本流程知道大概再动手,细节问题掉坑再爬。



0 0