一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Android

在eclipse中实现代码的自动换行

可以使用ctrl + shift + f 来格式化代码; 可以使用安装插件wordwrap来实现代码的自动换行:Help ->Install new Software->work with,点击Add,输入 name:wordwrap url:http://ahtik.com/eclipse-update/ 安装成功后重启eclipse   from:http://liangfangli86.blog.163.com/blog/static/9684863120116183727729/

龙生   08 Apr 2014
View Details

高效开发 Android App 的 10 个建议

假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比、耗电、耗内存。接下来就会得到用户的消极评论,最后名声也就臭了。即使你的应用设计精良、创意无限也没用。 耗电或者内存占用等影响产品效率的每一个问题都会影响App的成功。这就是为什么在开发中确保最优化、运行流畅而且不会使Android系统出问题 是至关重要的了。这里不需要讨论高效编程,因为我们不会关心你写的代码是否能够经得起测试。即使高效的代码也是需要时间来运行。今天这篇文章我们就讲讲怎 么尽可能地缩短运行时间,以及如何开发用户喜欢的App。 高效地利用线程 建议一:怎么在后台取消一些线程中的动作 我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受到影响。会导致程序陷入卡顿、死掉甚至会发生系统错误。 为了加快响应速度,需要把费时的操作(比如网络请求、数据库操作或者复杂的计算)从主线程移动到一个单独的线程中。最高效的方式就是在类这一级完成 这项操作,可以使用AsyncTask或者IntentService来创建后台操作。如果选择使用IntentService,它会在需要的时候启动起 来,然后通过一个工作线程来处理请求(Intent)。 使用IntentService时需要注意以下几点限制: 这个类不要给UI传递信息,如果要向用户展示处理结果信息请用Activity; 每次只能处理一个请求; 每一个处理请求过程都不能中断; 建议二:怎么保持响应不发生ANR 从UI线程中移除费时操作这个方式还可以防止用户操作出现系统不响应(ANR)对话框。需要做的就是继承AsyncTask来创建一个后台工作线程,并实现doInBackground()方法。 还有一种方式就是自己创建一个Thread类或者HandlerThread类。需要注意这样也会使App变慢,因为默认的线程优先级和主线程的优先级是一样的,除非你明确设定线程的优先级。 建议三:怎么在线程中初始化查询操作 当查询操作正在后台处理时,展示数据也不是即时的,但是你可以使用CursorLoader对象来加快速度,这个操作可以使Activity和用户之间的互动不受影响。 使用这个对象后,你的App会为ContentProvider初始化一个独立的后台线程进行查询,当查询结束后就会给调用查询的Activity返回结果。 建议四:其它需要注意的方面 使用StrictMode来检查UI线程中可能潜在的费时操作; 使用一些特殊的工具如Systrace或者Traceview来寻找在你的应用中的瓶颈; 用进度条向用户展示操作进度; 如果初始化操作很费时,请展示一个欢迎界面。 优化设备的电池寿命 如果应用很费电,请不要责怪用户卸载了你的应用。对于电池使用来说,主要费电情况如下: 更新数据时经常唤醒程序; 用EDGE或者3G来传递数据; 文本数据转换,进行非JIT正则表达式操作。 建议五:怎么优化网络 如果没有网络连接,请让你的应用跳过网络操作;只在有网络连接并且无漫游的情况下更新数据; 选择兼容的数据格式,把含有文本数据和二进制数据的请求全部转化成二进制数据格式请求; 使用高效的转换工具,多考虑使用流式转换工具,少用树形的转换工具; 为了更快的用户体验,请减少重复访问服务器的操作; 如果可以的话,请使用framework的GZIP库来压缩文本数据以高效使用CPU资源。 建议六:怎么优化应用在前端的工作 如果考虑使用wakelocks,尽量设置为最小的级别; 为了防止潜在的bug导致的电量消耗,请明确指定超时时间; 启用 android:keepScreenOn属性; 除了系统的GC操作,多考虑手动回收Java对象,比如XmlPullParserFactory和BitmapFactory。还有正则表达式的Matcher.reset(newString)操作、StringBuilder.setLength(0)操作; 要注意同步的问题,尽管在主线程中是安全的; 在Listview中要多采用重复利用策略; 如果允许的话多使用粗略的网络定位而不用GPS,对比一下GPS需要1mAh(25s * 140 mA),而一般网络只用0.1mAh(2s * 180mA); 确保注销GPS的位置更新操作,因为这个更新操作在onPause()中也是会继续的。当所有的应用都注销了这个操作,用户可以在系统设置中重新启用GPS而不浪费电量; 请考虑在大量数理运算中使用低精度变量并在用DisplayMetrics进行DPI任务时缓存变量值; 建议七:怎么优化工作在前台的应用 请确保service生命周期都是短暂的,因为每个进程都需要2MB的内存,而在前台程序需要内存时也会重新启动; 保持内存的使用量不要太大; 如果要应用每30分钟更新一次,请在设备处于唤醒状态下进行; Service在pull或者sleep状态都是不好的,这就是为什么在服务结束时要使用AlarmManager或者配置属性stopSelf()的原因。 建议八:其它注意事项 在进行整体更新之前检查电池的状态和网络状态,等待最好的状态在进行大幅度装换操作; 让用户看到用电情况,比如更新周期,后台操作的时候; 实现低内存占用UI 建议九:怎么找到布局显示问题 当我们为布局单独创建UI的时候,就是在创建滥用内存的App,它在UI中会出现可恶的延时。要实现一个流畅的、低内存占用的UI,第一步就是搜索 你的应用找出潜在的瓶颈布局。使用Android SDK/tools/中自带的Hierarchy Viewer Tool工具。 还有一个很好的工具就是Lint,它会扫描应用的源码去寻找可能存在的bug,并为控件结果进行优化。 建议十:如何解决问题 如果布局显示结果发现了问题,你可以考虑简化布局结构。可以把LinearLayout类型转化成RelativeLayout类型,降低布局的层级结构。 做到更加完美并不断优化 尽管以上的每条建议看起来都是很小的改进,但是如果它能成为你日常代码的一部分,那么你就会看到意想不到的结果。要让Google Play看到更多杰出的、流畅的、更快速、更省电的应用,向Android走向完美的目标迈进一步。 原文链接: azoft   翻译: 伯乐在线 – chris 译文链接: http://blog.jobbole.com/64279/ from:http://www.oschina.net/news/50413/android-application-development-tips

龙生   04 Apr 2014
View Details

Android中退出程序的提示框

@Override     public boolean onKeyDown(int keyCode, KeyEvent event) {         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {             dialog();             return true;         }         return true;     } protected void dialog() {         AlertDialog.Builder builder = new Builder(AccoutList.this);         builder.setMessage("确定要退出吗?");         builder.setTitle("提示");         builder.setPositiveButton("确认",         new android.content.DialogInterface.OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 dialog.dismiss();                 //AccoutList.this.finish();                 //System.exit(1);                 android.os.Process.killProcess(android.os.Process.myPid());             }         });         builder.setNegativeButton("取消",         new android.content.DialogInterface.OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {                 dialog.dismiss();             }         });         builder.create().show();     }   from:http://blog.csdn.net/jumping_android/article/details/7571309

龙生   19 Feb 2014
View Details

Android里面如何编写退出主程序的提示代码

在Android的手机里面,有个返回按键,通过返回按键,用户可以返回上一层的Activity, 又或者可以直接退出程序。这样,就给用户带来一个新的问题,当用户正在做着一些非常重要的事情的时候,比如浏览文件、或者是在编辑重要的数据的时候,不小心按了返回键,如果 当前的Activity正好是处于最外一层的时候,如果没有给按键定义一个退出的按钮的时候。用户可能通过返回按键就直接退出了整个程序,从而导致了一些 用户使用上的不必要而且可以避免的不愉快的事情发生。 那么,在整个程序退出的时候,如何做到提示的作用呢?我们希望做到的是,当用户要退出整个程序的时候,程序给出一个提示按钮,等用户再次确认后才退出。 现在,先看看如何编写退出程序的提示对话框。程序会用到AlertDialog 这个类,在这个类里面,当用户选择返回键的时候,会有两个按钮,一个是“确定”,一个是“取消”。为了响应事件,需要编写事件响应函数AlterDialog.setPositiveButton(int textId, DialogInterface.OnClickListener listener). –  textId, 要显示给用户看的资源或者文本 –  listener, 是用户单击“确定”或者“取消”按钮所响应的时间 当用户选择“确定”,就退出当前的对话框。其中,有个很重要的函数,Activity.finish(),通过调用这个函数,退出当前运行的整个Android程序。当用户选择“取消”的时候,只要单纯的retuan,即可返回主程序。可以定义一个showTips()的专用方法在main Activity里面,那么每次我们写的时候,就调用这个函数的就可以了。 private void showTips() {         AlertDialog alertDialog = new AlertDialog.Builder(this)                 .setTitle("退出程序").setMessage("是否退出程序")                 .setPositiveButton("确定", new DialogInterface.OnClickListener() {                     public void onClick(DialogInterface dialog, int which) {                         finish();                     }                 }).setNegativeButton("取消",                 new DialogInterface.OnClickListener() {                     public void onClick(DialogInterface dialog, int which) {                         return;                     }                 }).create(); // 创建对话框         alertDialog.show(); // 显示对话框     } 那么,在哪里调用这个提示的方法呢?应该找到的是返回按键的响应时间,也就是函数Activity. onKeyDown(int keyCode, KeyEvent event) 函数里面响应事件的发生。 public boolean onKeyDown(int keyCode, KeyEvent event) {         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {             showTips();             return false;         }         return super.onKeyDown(keyCode, event);     } 至此,通过复写onKeyDown函数,当用户单击返回的按钮的时候,就会弹出提示的对话框,可以有效地防止用户由于失误引起的不必要的退出。注意:强按Home键,一样可以退出应用,避开了提示框,这个方法只适合按返回键。 from:http://blog.chinaunix.net/uid-25885064-id-3386463.html

龙生   19 Feb 2014
View Details

Android详细的对话框AlertDialog.Builder使用方法

我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等方式,重写我们自己的对话框。当然,这也是不失为一个不错的解决方式,但是一般的情况却是这样,我们重写的对话框,也许只在一个特定的地方会用到,为了这一次的使用,而去创建一个新类,往往有点杀鸡用牛刀的感觉,甚至会对我们的程序增加不必要的复杂性,对于这种情形的对话框有没有更优雅的解决方案呢? 幸运的是,android提供了这种问题的解决方案,刚开始接触android的时候,我在做一个自定义对话框的时候,也是通过继承的方式来实现,后来随着对文档了解的深入,发现了android起始已经提供了相应的接口Dialog Builder ,下面我就吧相关的内容在这里分享一下,也能让更多的初学者少走弯路。 首先是一个最简单的应用,就是弹出一个消息框,在android中可以这样实现 new AlertDialog.Builder(self) .setTitle("标题")  .setMessage("简单消息框") .setPositiveButton("确定", null) .show();   效果如下:     上面的代码中我们新建了一个AlertDialog,并用Builder方法形成了一个对象链,通过一系列的设置方法,构造出我们需要的对话框,然 后调用show方法显示出来,注意到Builder方法的参数 self,这个其实是Activity对象的引用,根据你所处的上下文来传入相应的引用就可以了。例如在onCreate方法中调用,只需传入this即 可。   下面是带确认和取消按钮的对话框:   new AlertDialog.Builder(self)  .setTitle("确认") .setMessage("确定吗?") .setPositiveButton("是", null) .setNegativeButton("否", null) .show();           注意到,这里有两个null参数,这里要放的其实是这两个按钮点击的监听程序,由于我们这里不需要监听这些动作,所以传入null值简单忽略掉,但是实际开发的时候一般都是需要传入监听器的,用来响应用户的操作。 下面是一个可以输入文本的对话框:   new AlertDialog.Builder(self) .setTitle("请输入") .setIcon(android.R.drawable.ic_dialog_info) .setView(new EditText(self)) .setPositiveButton("确定", null) .setNegativeButton("取消", null) .show();   如上代码,我们用setView方法,为我们的对话框传入了一个文本编辑框,当然,你可以传入任何的视图对象,比如图片框,WebView等。。尽情发挥你的想象力吧~ 下面是单选框与多选框,也是非常有用的两种对话框:   new AlertDialog.Builder(self) .setTitle("请选择") .setIcon(android.R.drawable.ic_dialog_info)                 .setSingleChoiceItems(new String[] {"选项1","选项2","选项3","选项4"}, 0,    new DialogInterface.OnClickListener() {                                    public void onClick(DialogInterface dialog, int which) {         dialog.dismiss();      }   } ) .setNegativeButton("取消", null) .show();   1 new AlertDialog.Builder(self) 2 .setTitle("多选框") 3 .setMultiChoiceItems(new String[] {"选项1","选项2","选项3","选项4"}, null, null) 4 .setPositiveButton("确定", null)                 5 .setNegativeButton("取消", null) 6 .show(); 单选和多选对话框应该是我们平时用的非常多的,代码应该很好理解,下面再最后介绍两个 列表对话框:   1 new AlertDialog.Builder(self) 2 .setTitle("列表框") 3 .setItems(new String[] {"列表项1","列表项2","列表项3"}, null) 4 […]

龙生   19 Feb 2014
View Details

Android 设置窗口全屏

设置全屏包括两个部分: 窗口全屏和Activity全屏。 窗口全屏 是指隐藏系统顶部用来显示时间、电量、信号等信息的标题栏 。 Activity全屏 是指隐藏程序的标题栏。我们可以通过修改AndroidManifest.xml文件来实现。 1.窗口全屏fullscreen.java代码如下: package wzhnsc.test.style; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class fullscreen extends Activity {       @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);               //不显示程序的标题栏        requestWindowFeature( Window.FEATURE_NO_TITLE );               //不显示系统的标题栏                   getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN,                              WindowManager.LayoutParams.FLAG_FULLSCREEN );               setContentView( R.layout.main );    } } 2.修改 AndroidManifest.xml 我们可以修改activity或application的属性值来实现。 具体可以根据自己的情况来设置,两者区别如下: 1)activity: 只针对当前的Activity全屏。 2)application:所有的Activity都会全屏。 AndroidManifest.xml 内容如下: <?xml version="1.0" encoding="utf-8"?> <manifest      xmlns:android="http://schemas.android.com/apk/res/android"    package="wzhnsc.test.style"    android:versionCode="1"    android:versionName="1.0">    <application          android:icon="@drawable/icon"        android:label="@string/app_name"                          android:theme="@android:style/Theme.NoTitleBar.Fullscreen">        <activity android:name=".fullscreen"            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>     </application>    <uses-sdk android:minSdkVersion="1"/> </manifest> from:http://blog.sina.com.cn/s/blog_4c451e0e010133ab.html

龙生   11 Feb 2014
View Details

WebView控件基本使用

这一期创新,我们来谈谈浏览器控件即WebView。先说什么是webView控件吧。 WebView是一个浏览器控件,通过这个控件可以直接访问网页,或者把输入的HTML字符串显示出来,功能比较强大,有以下几个优点: 1、功能强大,支持CSS,Java script等HTML语言,这样页面就能更漂亮。 2、能够对浏览器控件进行非常详细的设置,比如字体大小,背景色,滚动条样式等等。 3、能够捕捉到所有浏览器操作,比如点击URL,打开或关闭URL 4、能够很好的融入布局。 5、甚至webView还能和JS进行交互。 在使用webView时,我们要先取得一个webView实例,如下: WebView  browser=(WebView)findViewById(R.id.webkit); 取得实例后,我们要给browser定义一下WebSettings,WebSettings是WebView的具体设置类,可以对WebView进行非常详细的设置。 WebSettings bs = browser.getSettings();  取得了webView设置对象。 下面开始设置浏览器控件,几个最常用的设置如下: 1、bs.setSupportMultipleWindows(false); 浏览器不支持多窗口显示,意思就是说所有页面在单一窗口打开,这样避免了页面布局控制显示问题,也便于操作控制页面。 2、bs.setSupportZoom(false);  页面是否可以进行缩放。 3、bs.setBlockNetworkImage(false);  是否阻止图像的显示 4、bs.setCacheMode(); 设置缓存的模式,分为几种: LOAD_CACHE_ELSE_NETWORK   当本地没有缓存时,从网上下载 LOAD_CACHE_ONLY   只读取本地缓存        LOAD_DEFAULT  默认的缓存模式 LOAD_NORMAL  一般的缓存模式 LOAD_NO_CACHE  不读取缓存,所有内容均从网络下载。 5、bs.setJavaScriptEnabled(flag);是否支持JS。 其他比如设置字体等更不必详说,通过设置我们可以获得一个我们需要的浏览器窗口。 接着,我们还需一个类来继承WebViewClient,这个类用来监控浏览器的一系列事件。 webNotify wn = new webNotify(); browser.setWebViewClient(wn) 下面列举比较常用的4个事件: 1,接收到Http请求的事件 onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) 2,打开链接前的事件 public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } 在这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。 3,载入页面完成的事件 public void onPageFinished(WebView view, String url){ } 同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。 4,载入页面开始的事件 public void onPageStarted(WebView view, String url, Bitmap favicon) { } 这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。 通过这几个事件,我们可以很轻松的控制程序操作,一边用着浏览器显示内容,一边监控着用户操作实现我们需要的各种显示方式,同时可以防止用户产生误操作。 最后我们的浏览器设置好了,可以监控操作了,于是打开一个网址: browser.loadUrl("http://www.baidu.com/"); 当然也可以是自己设定的一段html字符串,当然你的URL要符合规范。 browser.loadDataWithBaseURL() 如何和JS进行交互 到这里基本的webView的基本使用介绍完毕,接下来我们来讨论一下webView如何与JS进行交互,这个功能非常强大,能够做出很多意想不到的事情。 首先我们在页面里有这么一段JS代码: <html> <script language="javascript"> function wave() { document.getElementById("droid").src="android_waving.png"; } </script> <body>    <a> <img id="droid" src="android_normal.png"/><br> Click me! </a> </body>  </html> function wave()就是我们要调用的函数,首先要让browser能与页面进行交互bs.setJavaScriptEnabled(true);( 让浏览器支持JS)  接着: browser.addJavascriptInterface(new Object() { public void clickOnAndroid(){ mHandler.post(new Runnable(){ public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "index"); 这里的重点就是addJavascriptInterface(Object obj,String interfaceName)方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName,作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。 到此为止,我们就能在自己的浏览器里实现html页面里面的js 代码了,具体能实现什么功能这里就不做详细举例了,实用中就会发现,这个功能很强大。 from:http://wenku.baidu.com/link?url=lts8Sg3KWlu5M4l_dnGiL2rQ6ClPvGjW2ryKni3DSjv3J8WjSgJ9X0mwPk4KAGwJO9YUEaiZ8Kqv6lRTWe0pIfFORZVAQtrfqOMucBj2WLO

龙生   11 Feb 2014
View Details

WebView使用

大部分内容为网上整理其它高人的帖子,现只作整理,用于查看: 在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。 什么是webkit WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。 传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过, 随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon 3采用V8引擎,却仍然宣称自己是WebKit内核)。 这里我们初步体验一下在android是使用webview浏览网页,在SDK的Dev Guide中有一个WebView的简单例子 。 在开发过程中应该注意几点: 1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。 2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。 webview.getSettings().setJavaScriptEnabled(true); 3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。     mWebView.setWebViewClient(new WebViewClient(){                     public boolean shouldOverrideUrlLoading(WebView view, String url) {                         view.loadUrl(url);                         return true;                     }         });     4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。     public boolean onKeyDown(int keyCode, KeyEvent event) {         if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {             mWebView.goBack();                    return true;         }         return super.onKeyDown(keyCode, event);     }     下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以 为所欲为了。 看一个实例:     view plaincopy to clipboardprint? public class WebViewDemo extends Activity {     private WebView mWebView;     private Handler mHandler = new Handler();     public void onCreate(Bundle icicle) {         super.onCreate(icicle);         setContentView(R.layout.webviewdemo);         mWebView = (WebView) findViewById(R.id.webview);         WebSettings webSettings = mWebView.getSettings();         webSettings.setJavaScriptEnabled(true);         mWebView.addJavascriptInterface(new Object() {             public void clickOnAndroid() {                 mHandler.post(new Runnable() {                     public void run() {                         mWebView.loadUrl("javascript:wave()");                     }                 });             }         }, "demo");         mWebView.loadUrl("file:///android_asset/demo.html");     } }     我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。   […]

龙生   11 Feb 2014
View Details

Android学习系列(28)--App集成支付宝

手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能。 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫描一下,或者搜索一下,然后下单,不找零,直接送到你家,这将是手机支付给我们带来的全新交易体验。 谷歌刚推出了谷歌钱包,这必是我们后面要使用的主要手段,但是鉴于当前国情,我觉得有必要介绍一下android手机集成支付宝功能。 1.下载官方架包和说明文档 其实官方已经提供了安装指南,下载地址:  https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash https://mobiless.alipay.com/product/product_down_load.htm?code=SECURITY_PAY 里面有有个pdf,详细说明了说用指南,写的比较详细,可以重点参考。 下载下来,我们主要是用到Android(20120104)目录下的alipay_plugin.jar和AppDemo/assets下的alipay_plugin223_0309.apk,这两个文件是我们不能修改的支付宝api和安装包。 2. 商户签约 现在的安全机制,都是这样,客户端需要先和服务端请求验证后才能进行进一步操作,oauth也是如此。 打开https://ms.alipay.com/,登陆支付宝,点击签约入口,选择"应用类产品",填写并等待审核,获取商户ID和账户ID。 签约的时候还要向需要提供实名认证和上传应用,所以我建议先把应用做好了,最后再集成支付宝。 我大概等了1-2天审核,审核是失败的,回复是应用类型啥的应该是"虚拟货币",我改成那个马上自动就审核通过了。 3.密钥配置 解压openssl-0.9.8k_WIN32(RSA密钥生成工具).zip,打开cmd,命令行进入openssl-0.9.8k_WIN32(RSA密钥生成工具)\bin目录下, (1).执行 1 openssl genrsa  -out rsa_private_key.pem 1024 生成rsa_private_key.pem文件。 (2).再执行 1 openssl rsa  -in rsa_private_key.pem  -pubout -out rsa_public_key.pem 生成rsa_public_key.pem 文件。 (3).在执行 1 openssl pkcs8  -topk8  -inform PEM  -in rsa_private_key.pem  -outform PEM  -nocrypt 将RSA私钥转换成 PKCS8 格式,去掉begin和end那两行,把里面的内容拷贝出来,保存到某个txt中,如rsa_private_pkcs8_key.txt中(我好像没用到这个)。 打开rsa_public_key.pem,即商户的公钥,复制到一个新的TXT中,删除文件头”—--BEGIN PUBLIC KEY—--“与文件尾”—--END PUBLIC KEY—--“还有空格、换行,变成一行字符串并保存该 TXT 文件,然后在网站的“我的商家服务”切换卡下的右边点击“密钥管理”,然后有个"上传商户公钥(RSA)"项,选择上传刚才的TXT文件. 好了,服务器配置OK,因为这一段之前没有截图,现在弄好了又不好截图,如果有不明白的地方请大家参考官方文档。   错误提示 failure calling remote service  原因: 私钥没转PKCS8 4.引用jar和包含安装包 (1).新建android工程; (2).copy上面说的alipay_plugin.jar到工程的libs目录下,并在java build path中通过Add External JARs找到并引用该jar; (3).copy上面说的alipay_plugin223_0309.apk安装包到assets目录下,后面配置路径用到。 如果libs和assets目录没有,手动建立者两个目录。 5.调用代码整理 这里我们要严重的参考文档中AppDemo,我们建一个包com.tianxia.lib.baseworld.alipay,把AppDemo的com.alipay.android.appDemo4包下的源码全部copy到刚才我们自己的包下,还有res目录下的资源文件也合并到我们工程res下。 其中AlixDemo.java,ProductListAdapter.java,Products.java是示例类,我们借鉴完后可以删除。 PartnerConfig.java是配置类,配置商户的一些配置参数。 其他的类是严重参考类,直接留下使用。 PartnerConfig.java代码如下: 1 2 3 4 5 6 7 […]

龙生   26 Nov 2013
View Details