当前位置:  编程技术>移动开发
本页文章导读:
    ▪环境变量的配备        环境变量的配置 步骤如下: 1.首先,打开配置环境变量界面,如下操作:我的电脑---属性---高级---环境变量  2.系统变量(S)中配置如下:    2.1,新建系统变量:    变量名:JAVA_HOME    .........
    ▪ 替你的应用添加In App Purchase        为你的应用添加In App Purchase 自从10月16日苹果发送给所有开发者的那一封信,通知了程序内购买将可用于免费应用,我认为这也宣告了LITE版的时代结束。成千上万的免费版的软件或游戏,.........
    ▪ 【so easy~】自定义下上menu菜单       【so easy~】自定义上下menu菜单   最近做了自定义菜单,许多阅读器的样子,都是点击屏幕中央弹出menu(上下俩个) 直接说说思路吧, 1,利用PopupWindow来代替系统的menu(系统的样式死板,不.........

[1]环境变量的配备
    来源: 互联网  发布时间: 2014-02-18
环境变量的配置

步骤如下:

1.首先,打开配置环境变量界面,如下操作:我的电脑---属性---高级---环境变量 

2.系统变量(S)中配置如下: 

  2.1,新建系统变量: 

  变量名:JAVA_HOME 

  变量值:C:\Program Files\Java\jdk1.5.0_17(该目录为JDK安装的目录) 

  2.2,编辑CLASSPATH,如果没有该变量则新建, 

  变量名:CLASSPATH 

  变量值:%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(注:该变量值置于CLASSPATH即可, 

  其中:变量值最后要记得加“;”) 

  2.3,编辑PATH,如果没有则新建 

  变量名:PATH 

  变量值:.;%JAVA_HOME%\bin; (注:该变量值置于PATH前面,如果你只有一个JDK版本,可以不用编辑PATH,如果为了区别版本,那还是配置PATH变量值)。


    
[2] 替你的应用添加In App Purchase
    来源: 互联网  发布时间: 2014-02-18
为你的应用添加In App Purchase
自从10月16日苹果发送给所有开发者的那一封信,通知了程序内购买将可用于免费应用,我认为这也宣告了LITE版的时代结束。

成千上万的免费版的软件或游戏,将作为限制了功能的完整版免费发售,如果用户觉得有意购买,可以直接解锁完整版的功能或购买附加内容。
本文讲阐述如何为你现有的应用或游戏添加程序内购买(In App Purchase)功能。

阅读前提:假设了你拥有一定的iPhone SDK开发基础,和App Store实践经验。

你的程序需要唯一的Bundle ID, 如果已经发布的程序使用了通配符,那么就不能直接添加该功能。如果拥有了唯一的ID,请在program portal中添加你的app id,允许程序使用内购买(Enable In App Purchase)。

在设计好你的程序内购买的功能以后,首先需要定义元数据。来到iTunes Connect,在Manage Your In App Purchases中为你的程序添加一个程序内购买的商品。



上面第一个部分是添加的内部信息。参考名称,ID,类型,和价格。以及各种本地化信息。
这里简单说一下类型的选择,其他信息,以及In App Purchase支持什么类型的商品请查看Getting Started with In App Purchase。

Non-consumable 默认类型,非消耗品,具有持久性,特点是一次性购买,可用在所有设备。例如解锁游戏的储存关卡功能。
Consumable 消耗品,用完或使用后消失,可多次购买,不能用在所有的设备,例如游戏中的血瓶或技能书。
Subscription 订阅,和消耗品一样,除了可以在设备之间共享。

创建购买流程
大致可以分为十个步骤:

验证App Store存取权限
这样做是因为,家长控制或一些公司的配置文件阻止了此功能,使用支付队列的查询功能canMakePayments来确定用户是否有权限购买,返回值YES代表可以购买/NO代表没有权限购买。
载入目录
载入储存在本地或者远程的商品目录。
获得商品本地化信息
程序向App Store发起查询请求获得目录中商品的本地化信息。:
myPossibleProds = [NSSet setWithObjects: @”myProd1”, @”myProd2”, @”myProd3, nil];
myProdRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: myPossibleProds];
myProdRequest.delegate = myProductsRequestDelegate;
[myProdRequest start];
程序接收来自App Store的回应:
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
response包含可能的信息
response.products //产品信息
response.invalidProductIdentifiers //错误的产品标示符
错误的产品可能由下面的原因导致:
商品未在 iTunes Connect中录入。
商品没有选择“Cleared for Sale”。
商品还没有传播到所有服务器。
创建商品信息
前面的步骤获得了产品信息的数组用以呈现:
myAvailableProductsArray = response.products;
for (SKProduct* aProduct in myAvailableProductsArray) {
diplayTitle = aProduct.localizedTitle;
displayDesc = aProduct.localizedDescription;
displayPrice = aProduct.price;
}
呈现商品信息
在UI中显示前面获得的信息
请求支付
myPayment = [SKPayment paymentForProductIdentifier: selectedProdID userInfo: nil]; 
或
myPayment = [SKPayment paymentForProduct: selectedProduct userInfo: nil]; 
然后提交到队列
defaultPaymentQueue = [SKPaymentQueue defaultQueue];
[defaultPaymentQueue addTransactionObserver: myObserver];
[defaultPaymentQueue addPayment: myPayment]; 
[defaultPaymentQueue addPayment: myRequest];

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
验证支付的事务
for(SKPaymentTransaction *aTransaction in transactions) {
switch (aTransaction.transactionState ) {
// 商品进入购买流程
case SKPaymentTransactionStatePurchasing:
...
break;
// 成功购买商品
case SKPaymentTransactionStatePurchased:
...
break;
// 已经购买过该商品
case SKPaymentTransactionStateRestored:
...
break; 
// 用户取消交易
case: SKPaymentTransactionStateFailed
...
break; 
App Store的交易回执
aTransaction.transactionReceipt

Used to validate e-commerce transaction
Cryptographically signed chunk of data
Contains information about the purchase
Can validate using Web-based API
收到交易回执以后可以传送到你的服务器处理该交易。
你的服务器可以向苹果发送交易验证信息。
苹果的交易验证地址:https://buy.itunes.apple.com/verifyReceipt
验证数据格式:{ receipt-data : …}
苹果的返回值如果是{ status : 0 } 那么交易是正确,如果返回任何其他值 { status : any_other_value } 交易就是不成立。
你的服务器收到苹果的验证成功信息以后,返回给应用程序类似于解锁功能等消息。

解锁内置物品火提供远程存取地址
需要注意的地方
用户可能随时退出程序。
Store Kit 的交易队列是持久化的。
交易是持久化的。
验证存取。
移除交易。
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

储存购买
需要将非消耗的购买记录在服务器上,以供用户更换设备或删除程序以后重新安装时再次解锁功能。
提供物品恢复
前面的代码中,已经购买过该商品的处理就是直接解锁。
defaultPaymentQueue = [SKPaymentQueue defaultQueue];
[defaultPaymentQueue restoreCompletedTransactions];



测试沙盒环境
只供给测试用户,并且设备上才有效,不能使用模拟器测试。
可以为每个国家的商店添加测试帐号。
不能用来测试其他的iTunes Store特性。
需要为每个测试添加唯一的email地址,可以考虑使用+
payam+usa@example.com—测试美国的商品
payam+uk@example.com—测试英国的商品
payam+jp@example.com—测试日本的商品
测试步骤,需要在设备的设置菜单中iTunes Store登出原有帐户。
然后不要在设置菜单中登录测试帐号,而是直接打开需要测试的程序进行测试。
在这之前需要在iTunes Connect的Manage Users菜单中添加In App Purchase测试用户。

财务报表

收入和应用程序同样的规则
你获得总收入的70%。
支付日程,使用税,报表等全部都一样。
报表
一样的报表格式。
贩卖的标示符栏显示物品的产品ID。
所有者标示符栏显示程序的ID。
本文部分内容参考自In App Purchase Programming Guide和WWDC 2009 Sessions,如需转载请注明出处。

    
[3] 【so easy~】自定义下上menu菜单
    来源: 互联网  发布时间: 2014-02-18
【so easy~】自定义上下menu菜单

 

最近做了自定义菜单,许多阅读器的样子,都是点击屏幕中央弹出menu(上下俩个)



直接说说思路吧,

1,利用PopupWindow来代替系统的menu(系统的样式死板,不可修改)。

2,上下两个菜单实际上是一个PopupWindow,因为同时弹出两个PopupWindow不能同时消失(如果能解决这个问题也可以直接弹出两个或多个PopupWindow)。

3,因为上下条menu,中部需要 放一个透明的区域,设置监听,点击dismiss。

 

下面直接使用了一位网友的例子:

使用PopupWindow来做自定义menu,往PopupWindow增加一个子View,子View的布局就是menu的布局。

出现和退出的动画:可以给PopUpWindow或它的子view添加。

网上所有用PopupWindow做的menu有个共同特点:就是点击menu键出现PopupWindow,然后再点击menu键无法使PopupWindow退出/dismiss()。

当给PopupWindow设置了setFocusable(true),menu显示后,点击menu其他任何地方,menu都会消失,但是这时候按钮的点击事件其实是不响应的。同时只响应键盘的返回键,其他按键均不响应,比如点击menu键,没有任何反应。

要解决这个问题很简单,就是给PopupWindow的子View设置下面的代码:

[java] view plaincopy
  • //sub_view 是PopupWindow的子View  
  • sub_view.setFocusableInTouchMode(true);  
  • sub_view.setOnKeyListener(new OnKeyListener() {  
  •     @Override  
  •     public boolean onKey(View v, int keyCode, KeyEvent event) {  
  •         // TODO Auto-generated method stub  
  •         if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {  
  •             mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行  
  •             return true;  
  •         }  
  •         return false;  
  •     }  
  • });  
  •  


     记住,一定要给PopupWindow设置setFocusable(true),要不然点击menu其他地方以及返回键,menu都不会退出。且这时候是响应PopupWindow的parent的menu事件的。

    下面阐述为什么这么写之后,当PopupWindow显示后,点击menu键PopupWindow会退出的原因:

    首先得明白为什么给PopupWindow setFocusable(true)后,点击menu出现PopupWindow后再点击menu没反应的原因。

    PopupWindow初始化的时候一般都指定了在哪个View上出现,我们称这个View为parent。parent里面写了点击menu出现PopupWindow的事件,如果给PopupWindow setFocusable(true),此时屏幕的焦点在PopupWindow上面,肯定是不会响应parent的按键事件的,它只会响应PopupWindow的按键事件。

    但是PopupWindow的本质是Window,没有继承View类,自己没有onkeyDown或onkey或dispatchKey这些事件的。我刚开始试着实现这些接口,但是按键依然不响应,不知原因。因现在对按键的原理还不熟,无法阐述其原因。

    然后我想绕道而行,就是给PopupWindow的子View注册按键事件,setKeyListener,刚开始我在子View的xml设置了android:focusable=”true” 但按键事件依然不响应。。。。纠结啊纠结。。。然后没得办法,我google了所有关于PopupWindow的文章。。。最后终于被我发现。。。需要给PopupWindow的子View 设置setFocusableInTouchMode(true)。这时候按键事件就响应了。。。

     

    下面附上完整代码:

    [java] view plaincopy
  •    /*必须重写,否则点击MENU无反应  为了让他不显示,下面onMenuOpened()必须返回false*/  
  • @Override  
  • public boolean onCreateOptionsMenu(Menu menu) {  
  •     menu.add("menu");// 必须创建一项  
  •     return super.onCreateOptionsMenu(menu);  
  • }  
  • /** 
  •  * 拦截MENU 
  •  */  
  • @Override  
  • public boolean onMenuOpened(int featureId, Menu menu) {  
  •     if(mPopupWindow != null){  
  •         if(!mPopupWindow.isShowing()){  
  •             /*最重要的一步:弹出显示   在指定的位置(parent)  最后两个参数 是相对于 x / y 轴的坐标*/  
  •             mPopupWindow.showAtLocation(findViewById(R.id.linear_menu_parent), Gravity.BOTTOM, 0, 0);  
  •         }  
  •     }  
  •     return false;// 返回为true 则显示系统menu  
  • }  
  •   
  •      
  •    private void initPopuWindow(int menuViewID){  
  •     LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
  •     /*设置显示menu布局   view子VIEW*/  
  •     sub_view = mLayoutInflater.inflate(menuViewID, null);  
  •     /*第一个参数弹出显示view  后两个是窗口大小*/  
  •     mPopupWindow = new PopupWindow(sub_view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  •     /*设置背景显示*/  
  •     mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_menu_popup));  
  •     /*设置触摸外面时消失*/  
  •     mPopupWindow.setOutsideTouchable(true);  
  •     /*设置系统动画*/  
  •     mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);  
  •     mPopupWindow.update();  
  •     mPopupWindow.setTouchable(true);  
  •     /*设置点击menu以外其他地方以及返回键退出*/  
  •     mPopupWindow.setFocusable(true);  
  •       
  •     /** 1.解决再次点击MENU键无反应问题   
  •      *  2.sub_view是PopupWindow的子View 
  •      */  
  •     sub_view.setFocusableInTouchMode(true);  
  •     sub_view.setOnKeyListener(new OnKeyListener() {  
  •         @Override  
  •         public boolean onKey(View v, int keyCode, KeyEvent event) {  
  •             // TODO Auto-generated method stub  
  •             if ((keyCode == KeyEvent.KEYCODE_MENU)&&(mPopupWindow.isShowing())) {  
  •                 mPopupWindow.dismiss();// 这里写明模拟menu的PopupWindow退出就行  
  •                 return true;  
  •             }  
  •             return false;  
  •         }  
  •     });  
  •       
  •       
  •     /*监听MENU事件*/  
  •     menu = new View[3];  
  •     menu[0] = sub_view.findViewById(R.id.menu_0);  
  •     menu[1] = sub_view.findViewById(R.id.menu_1);  
  •     menu[2] = sub_view.findViewById(R.id.menu_2);  
  •       
  •     menu[0].setOnClickListener(new OnClickListener() {  
  •         @Override  
  •         public void onClick(View v) {  
  •             // doSomething  
  •               
  •         }  
  •     });  
  •       
  •     menu[1].setOnClickListener(new OnClickListener() {  
  •         @Override  
  •         public void onClick(View v) {  
  •             // doSomething  
  •               
  •         }  
  •     });  
  •       
  •     menu[2].setOnClickListener(new OnClickListener() {  
  •         @Override  
  •         public void onClick(View v) {  
  •             // doSomething  
  •               
  •         }  
  •     });  
  •    }  
  •  


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3