android 查询公交车还有几站的android 艾特功能实现现

1016人阅读
Android百度公交开发(6)
本文主要讲解如何通过百度地图API搜索得到一个城市里的所有POI。这里有必要对“所有”这个词进行强调一下,以便引起重视,之所以这样说,是因为在搜索POI时,默认仅返回一页的搜索结果10条,那么如何才能得到所有的搜索结果呢?其实baidu
map api是提供了相关的方法,但我发现有相当多的网友都在问这个问题,所以有必要讲解演示一下。
&&&&& 先讲一下什么称之为“城市POI搜索”?它与我们在上一篇文章()中了解到的POI搜索有什么区别呢?
&&&&&&上一篇文章中所调用的是地图API的“周边POI搜索”服务,即检索周围多少米以内的POI;而本章所要调用的是地图API的“城市POI搜索”服务,即检索某个城市中所有的POI。如果你看完这两篇文章后,你会发现仅仅是调用的方法不同而以,搜索结果的处理方法是同一个方法,搜索结果的处理代码也是完全一样的。
&&&&& 下面将给出城市POI搜索的一个完整示例,并且会讲解如何才能获取到所有的搜索结果。
1)布局文件res/layout/poi_city_search.xml
2)继承了com.baidu.mapapi.MapActivity的Activity类
3)AndroidManifest.xml中的配置
4)运行结果
程序运行起来后,我们输入关键词“ktv”进行搜索,而在代码中我们设置了搜索城市为“贵阳”,即我们要搜索贵阳市所有的KTV。搜索完成后,首先会弹出一个对话框,如上图所示,显示了搜索到了POI总数及每一个POI名称,点击“关闭”按钮后,可以看到搜索到的ktv所在位置也在地图上进行了标注。
&&&&&&到目前为止,一切看起来很正常。然而,真的是这样吗?请仔细看上面第一张图中显示的搜索结果数为60,即在贵阳市总共个60家ktv,但是下面却只显示了10家ktv名称,并且第二张图中地图中也只标注了10家ktv,这到底是为什么呢?其它50家ktv结果去哪了?原因是这样的:
&&&&&&一次搜索所得到的POI数有时候可能有成千上万个,比如你搜索“餐厅”试试,试想如果一次性从百度地图服务器上返回上万条搜索结果数据到客户的手机上将会是一种什么样的情况?所以百度地图API对一次性返回的搜索结果进行了限制--一次性最多只能返回50条搜索结果,默认情况下一次性返回10条搜索结果。我们可以通过下面的方法去改变一次性返回的搜索结果数:
&&&&&&&&&&&&// 设置每页返回的POI数,默认为10,取值范围1-50
&&&&&&&&&&& MKSearch.setPoiPageCapacity(10);
但最大也只能设置为50。那么怎么才能一次性得到所有的搜索结果呢?怎么才能得到上面示例中的60家ktv的信息呢?让我们来改一下上面Activity中处理搜索结果的方法onGetPoiResult,其实所有代码都保持不变。将onGetPoiResult方法内的处理代码修改为:
再来看一下运行结果:
怎么样?搜索到的60家ktv信息一次性全部显示出来了吧。关键在于下面这3行代码:
&&&&&&&&&&&&if(result.getPageIndex() & result.getNumPages()-1) {
&&&&&&&&&&&&&&&&& mMKSearch.goToPoiPage(result.getPageIndex() + 1);
&&&&&&&&&&& }
服务器是以分页的形式分多次向我们返回搜索结果的,result.getPageIndex()得到的是当前页码(从0开始)。这3行代码的含义是:如果当前页不是最后一页,那么就转到下一页(goToPoiPage方法是作用是跳转到搜索结果的第几页),每次调用goToPoiPage方法,都会再次触发搜索请求,也就会再次回调执行onGetPoiResult方法;这和网页中的服务器端分页是一个道理,即每次点击“上一页”、“下一页”都会再一次提交查询请求。这也就是为什么我们要采用static类型的StringBuilder对象来保存搜索结果而不是在onGetPoiResult方法中定义一个局部变量,并且还要在每次点击“搜索”按钮后,重新创建一个新的StringBuilder对象来存储搜索结果。
&&&&& 完!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43480次
排名:千里之外
原创:27篇
转载:33篇
评论:16条
(1)(1)(6)(7)(1)(10)(32)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'android利用provider查询同一个数据库中没有对外暴露出来的表
时间: 18:18:53
&&&& 阅读:97
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&【原创】转载请加本篇博客地址
个人感觉这是android provider 的一个漏洞, 废话少说直接上代码
public String getCanonicalAddresses(String recipient_ids){
String[] ids=recipient_ids.split(" ");
System.out.println("recipient_ids:"+recipient_ids);
String addressResult="";
for (int i = 0; i & ids. i++) {
Cursor cur=ReadSmsActivity.this.getContentResolver().query(Uri.parse("content://mms/"),
new String[]{" * from canonical_addresses where _id="+ids[i].toString()+" --"}, null,null,null);
if(cur.getCount()&0){
while (cur.moveToNext()){
<span style="color: #
String _id=cur.getString(cur.getColumnIndex("_id"));
<span style="color: #
String address=cur.getString(cur.getColumnIndex("address"));
<span style="color: #
addressResult+="{"+_id+","+address+"}";
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
return addressR
<span style="color: #
看第6和第7行,mms provider 实际上查询彩信相关的内容,并没有提供canonical-address的查询功能。 但是上面这种写法,通过在query方法入参的projection中直接写上几乎整条查询语句,并在后面加上“--”&实现了通过mms provider直接查询db中canonical_addresses表的功能。
大家都知道 projection中通常都是要查的表中的各个列名, 所以最后拼出来放到数据库中执行的sql语句类似于 SELECT projection FROM table where ....
但是这里讲projection完全替换成另一个完整的语句, 所以最后拼出来的样子大致是 SELECT * from canonical_addresses where _id="2" -- FROM table where ....
Sql 中“--” 是注释的意思。 这个方法正是利用了这一点, 把原来provider通过URI限定的查询语句偷换成了另外一个查询语句,从而得到了一个私有表的查询结果。标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!一个大学生,想开发一个公交实时查询类安卓app,难度有多大? - 知乎6被浏览425分享邀请回答0添加评论分享收藏感谢收起1添加评论分享收藏感谢收起查看更多回答Android&页面之间数据传递方式有几种?各有何优势?
Android页面间数据传递方式
一、Activity之间数据传递与共享
1、基于消息的通信机制
Intent---bounble,extra
A)Android为了屏蔽进程的概念,利用不同组件【Activity、Service】来表示进程之间的通信!其核心是Intent,通过Intent可以开启一个Activity或Service,不论这个Activity或者Service是当前应用还是其他应用。
B)数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream,或者LinkList链表等数据类型就不太好。
C)Intent包括两部分:
目的[action]:要往哪里去;
内容[category、data]:路上带了些啥,区分性数据和内容型数据
D)Intent类型
显式:直接指定消息目的地,只适合同一进程内不同组件之间通信,如new Intent(this,Target.class)
隐式:AndroidMainifest.xml中注册,一般用于跨进程通信,如new Intent(String action)
E)实现Intent简单继承间通信
,显式实现较为简单
在AndroidManifest.xml中定义
1)一个activity包含
零个或多个主要是作为匹配的标准,能否匹配成功由,、三个tag决定
2)一个包括
一个或多个:
零个或多个:
--说明该是该project运行的第一个界面
--说明该可以作为Launcher的,即系统操作界面
--缺省情况
零个或多个:指定携带的数据的类型,使用MIME类型描述方式来描述
video/mpeg表示编码格式为mpeg的视频,也可以使用通配符video/*表示任意格式的视频文件类型;
在查询ContentProvider时,可以使用
查询上来的数据是多个记录
查询上来的数据是单个记录如上设置,要重写SQLiteOpenHelper的getType(Uri uri)方法
public String getType(Uri uri) {
&&final int match =
sUriMatcher.match(uri) ;
&&switch(match)
&&case NOTES :
&&case LIVE_FOLDER_NOTES:
"vnd.android.cursor.dir/vnd.myq.note" ;
&&case NOTES_ID :
"vnd.android.cursor.item/vnd.myq.note" ;
&&default:
& &throw new
IllegalArgumentException("invalid uri : " + uri) ;
数据的URI由scheme(协议),host,port,path四部分:scheme://host:port/path
http://localhost:8080/test.jsp" /&
3)一个Intent对应多种匹配结果的处理说明:
&&&&&&&&&&&&&&&&&&
分响应消息的组件类型:
&&&&&&&&&&&&&&&&&&
3.1)如果是Service那么这些Service都可以启动并处理消息
&&&&&&&&&&&&&&&&&&
3.2)如果是Activity则会弹出对话框让用户选择
4)安全性问题
如果不同进程间的组件可以通过隐式消息互相通信,那程序不是可以轻易调用到其他的程序或者系统中的一些敏感程序的组件,这样会不会很不安全呢?其实Android在安全方面有一个统一,完备和轻便的安全策略模型。
简单一点说就是:权限设置问题我们可以自己定义permission,然后在需要的组件处设置该permission,那么用户要想该组件,必须要配置该permission,否则访问失败的!
4.1)定义permission
&&&android:name="com.myq.android.permission.DATETIME_SERVICE"
&&&android:permissionGroup="android.permission-group.MYQ_INFO"
&&&android:protectionLevel="normal"
4.2)配置permission
4.3)使用permission
利用static静态数据,public static
事实上,回收期并不可靠,尤其是在手机上,更加不可靠。因此,除非要使自己程序越老越糟糕,否则尽量远离static。
使用static常见错误:
ERROR/AndroidRuntime(4958): Caused by:
java.lang.OutOfMemoryError: bitmap size exceeds VM
基于外部存储的传输
File/Preference/Sqlite,如果要针对第三方应用需要Content Provider
4、基于IPC通信机制
与 service之间的传输,如Activity与Service之间通信,定义AIDL接口文件,示例:
有了Intent这种基于消息的进程内或进程间通信模型,我们就可以通过Intent去开启一个Service,可以通过Intent跳转到另一个Activity,不论上面的Service或Activity是在当前进程还是其它进程内即不论是当前应用还是其它应用的Service或Activity,通过消息机制都可以进行通信!
但是通过消息机制实现的进程间通信,有一个弊端就是,如果我们的Activity与Service之间的交往不是简单的Activity开启Service操作,而是要随时发一些控制请求,那么必须就要保证Activity在Service的运行过程中随时可以连接到Service。
:音乐播放程序后台的播放服务往往独立运行,以方便在使用其他程序界面时也能听到音乐。同时这个后台播放服务也会定义一个控制接口,比如播放,暂停,快进等方法,任何时候播放程序的界面都可以连接到播放服务,然后通过这组控制接口方法对其控制。
如上的需求仅仅通过Intent去开启Service就无法满足了!从而Android的显得稍微笨重的IPC机制就出现了,然而它的出现只适用于Activity与Service之间的通信,类似于远程方法调用,就像是C/S模式的访问,通过定义AIDL接口文件来定义一个IPC接口,Server端实现IPC接口,Client端调用IPC接口的本地代理。
由于IPC调用是同步的,如果一个IPC服务需要超过几毫秒的时间才能完成的话,你应该避免在Activity的主线程中调用,否则IPC调用会挂起应用程序导致界面失去响应。在
这种情况下,应该考虑单起一个线程来处理IPC访问。
两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。
IPC机制鼓励我们“尽量利用已有功能,利用IPC和包含已有功能的程序协作完成一个完整的项目”
IPC实现demo:我的
project --&
package --&
1、AIDL文件,我是放在package下,
IDateTimeService.aidl
package com.myq.android.MultiProcessT
interface IDateTimeService&
String getCurrentDateTime(in String format) ;
如果正确配置,会在gen下,生成同名的java文件简单摘要:
//我们需要实现的类Stub
public interface&&extends
android.os.IInterface
public static abstract class
extends android.os.Binder
implements com.myq.android.MultiProcessTest.IDateTimeService
//获取实例的方法asInterface
public static
com.myq.android.MultiProcessTest.IDateTimeService&(android.os.IBinder
//我们自己的业务方法,需要实现的
public java.lang.String&(java.lang.String
format) throws android.os.RemoteE
2、Service中实现IDateTimeService.Stub
package com.myq.android.MultiProcessT
import java.text.SimpleDateF
import java.util.D
import android.app.S
import android.content.I
import android.os.IB
import android.os.RemoteE
import android.util.L
public class DateTimeService extends Service {
public static final String DATETIME_SERVICE_ACTION =
"com.myq.android.MultiProcessTest.DATETIMESERVICE_ACTION" ;
private static final String TAG = "--------DateTimeService-------"
private&&SimpleDateFormat sdf
private final IDateTimeService.Stub stub = new
IDateTimeService.Stub()
&&public String
getCurrentDateTime(String format) throws RemoteException {
getCurrentDateTimeString(format) ;
private synchronized String getCurrentDateTimeString(String
&&&sdf = new
SimpleDateFormat(format) ;
&&&final String
temp = sdf.format(new Date()) ;
&Log.i(TAG,"getCurrentDateTimeString--" +
Thread.currentThread() + "--" + temp) ;
public IBinder onBind(Intent arg0)&
&&Log.i(TAG, "onBind--" +
Thread.currentThread()) ;
3、Client端代码实现
private ServiceConnection mServiceConn = new
ServiceConnection()
&&public void
onServiceConnected(ComponentName name, IBinder service) {
& &mDateTimeService =
IDateTimeService.Stub.asInterface(service) ;
&&public void
onServiceDisconnected(ComponentName name) {
& &mDateTimeService = null
说明:网上的好多资料都没有涉及IPC调用的AIDL的具体说明!它本质上是Server端和Client端都具有相同的AIDL文件,要位于相同的包下,即package的包名药一样,然后才能正确的通过proxy访问,否则client与server的aidl文件处于不同package会出错的。
aidl模型如下:
|&--------------------aidl----------------------&|
client端--&proxy&&----------parcel数据包-------- stub&---server端从而proxy+parcel+stub构成了aidl.只不过,proxy运行在客户进程,而stub运行在服务端进程。当你通过aidl去访问服务端时,客户端会阻塞在proxy,服务端处理完后,通知proxy返回。
5、基于Application Context
相当于web的Application
可以通过Context.GetApplicationContext或者Context.GetApplication方法获得Application Context。但注意,这里获得只是Context对象,更理想的是获取一个类的对象。如下定义一个类:
net.blogjava.mobile1;
android.app.A
import& android.graphics.B
public& class&
MyApp& extends& Application
private& Bitmap mB
public& Bitmap getBitmap()
return& mB
public& void& setBitmap(Bitmap
this .mBitmap& =&
上面的类与普通的类没有什么本职区别,但该类继承Application,是其子类,这也是使用Application.Context的第一步,定义一个继承自Application的类。然后,就在这个子类下定义任何我们想使其全局存在的变量,如本例的Bitmap对象。当然,还需要在标签中使用android:name 属性来指定这个类。代码如下:
application& android:name
=".MyApp"& android:icon
="@drawable/icon"& android:label
="@string/app_name" &&
&/ application&
最后,使用。从该子类中存取对象,代码如下
(MyApp)getApplication();
&&& Bitmap
bitmap& =&
BitmapFactory.decodeResource( this .getResources(),
R.drawable.icon);
myApp.setBitmap(bitmap);
imageview& =&
(ImageView)findViewById(R.id.ivImageView);
(MyApp)getApplication();
imageview.setImageBitmap(myApp.getBitmap());&
上述两段代码可在任何Service、Activity中使用,全局的。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。android-现在进行一个类似今日头条的安卓开发,需要在详情页实现类似微信点赞功能,求指导。(有数据同步的)
作者:用户
浏览:475 次
现在进行一个类似今日头条的安卓开发,需要在详情页实现类似微信点赞功能,求指导。(有数据同步的)现在进行一个类似今日头条的安卓开发,需要在详情页实现类似微信点赞功能,求指导。(有json数据传输的)ht
现在进行一个类似今日头条的安卓,需要在详情页实现类似微信点赞功能,求指导。(有数据同步的)
现在进行一个类似今日头条的安卓开发,需要在详情页实现类似微信点赞功能,求指导。(有json数据传输的)
解决方案二:
解决方案三:
解决方案四:
实际上就是popupwindow
+ expandableListView
解决方案五:
如何实现类似微信朋友圈的点赞列表以及评论列表
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供

我要回帖

更多关于 android定位功能实现 的文章

 

随机推荐