Nginx应用之Location路由反向代理及重写策略

一、常用设置 1、日志格式 log_format main '<span class="katex math inline">time_iso8601|</span>remote_addr|<span class="katex math inline">remote_user|</span>request_method|<span class="katex math inline">uri|' '</span>status|<span class="katex math inline">request_time|</span>request_length|<span class="katex math inline">body_bytes_sent|</span>bytes_sent|' '<span class="katex math inline">connection|</span>http_x_forwarded_for|<span class="katex math inline">upstream_addr|</span>upstream_status|' '<span class="katex math inline">upstream_response_time|</span>args|<span class="katex math inline">http_referer|</span>http_user_agent'; access_log logs/access.log main; 2、反向代理透传客户端IP设置 proxy_set_header Host <span class="katex math inline">http_host; proxy_set_header X-Real-IP</span>remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 3、全局变量 $args #这个变量等于请求行中的参数。 $content_length #请求头中的Content-length字段。 $content_type #请求头中的Content-Type字段。 $document_root #当前请求在root指令中指定的值。 $host #请求主机头字段,否则为服务器名称。 $http_user_agent #客户端agent信息 $http_cookie #客户端cookie信息 $limit_rate #这个变量可以限制连接速率。 $request_body_file #客户端请求主体信息的临时文件名。 $request_method #客户端请求的动作,通常为GET或POST。 $remote_addr #客户端的IP地址。 $remote_port #客户端的端口。 $remote_user #已经经过Auth Basic Module验证的用户名。 $request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。 $query_string #与$args相同。 $scheme #HTTP方法(如http,https)。 $server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 $server_addr #服务器地址,在完成一次系统调用后可以确定这个值。 $server_name #服务器名称。 $server_port #请求到达服务器的端口号。 $request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 $uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 $document_uri #与$uri相同。 二、Rewrite规则 ...

2018年2月17日 · 2 分钟 · 天边的星星

高德地图知识汇总

//设置缩放级别 aMap.moveCamera(CameraUpdateFactory.zoomTo(17)); //将地图移动到定位点 aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude()))); //点击定位按钮 能够将地图的中心移动到定位点 mListener.onLocationChanged(amapLocation); //添加图钉 aMap.addMarker(getMarkerOptions(amapLocation)); //获取定位信息 StringBuffer buffer = new StringBuffer(); buffer.append(amapLocation.getCountry() + “” + amapLocation.getProvince() + “” + amapLocation.getCity() + “” + amapLocation.getProvince() + “” + amapLocation.getDistrict() + “” + amapLocation.getStreet() + “” + amapLocation.getStreetNum()); Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show(); isFirstLoc = false; //定位的小图标 默认是蓝点 这里自定义一团火,其实就是一张图片 MyLocationStyle myLocationStyle = new MyLocationStyle(); myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.firetwo)); myLocationStyle.radiusFillColor(android.R.color.transparent); myLocationStyle.strokeColor(android.R.color.transparent); aMap.setMyLocationStyle(myLocationStyle); //定位 private void initLoc() { //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //设置定位回调监听 mLocationClient.setLocationListener(this); //初始化定位参数 mLocationOption = new AMapLocationClientOption(); //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //设置是否返回地址信息(默认返回地址信息) mLocationOption.setNeedAddress(true); //设置是否只定位一次,默认为false mLocationOption.setOnceLocation(false); //设置是否强制刷新WIFI,默认为强制刷新 mLocationOption.setWifiActiveScan(true); //设置是否允许模拟位置,默认为false,不允许模拟位置 mLocationOption.setMockEnable(false); //设置定位间隔,单位毫秒,默认为2000ms mLocationOption.setInterval(2000); //给定位客户端对象设置定位参数 mLocationClient.setLocationOption(mLocationOption); //启动定位 mLocationClient.startLocation(); } ...

2016年12月18日 · 4 分钟 · 天边的星星

高德地图,定位 ,中间固定点拖动获取位置

import android.graphics.Color; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.ViewTreeObserver; import android.view.animation.LinearInterpolator; import android.widget.TextView; import android.widget.Toast; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.LocationSource; import com.amap.api.maps.MapView; import com.amap.api.maps.UiSettings; import com.amap.api.maps.model.CameraPosition; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.amap.api.maps.model.animation.Animation; import com.amap.api.maps.model.animation.RotateAnimation; import com.amap.api.services.core.LatLonPoint; import com.amap.api.services.geocoder.GeocodeResult; import com.amap.api.services.geocoder.GeocodeSearch; import com.amap.api.services.geocoder.RegeocodeQuery; import com.amap.api.services.geocoder.RegeocodeResult; import com.tlh.gczp.R; import com.tlh.gczp.mvp.view.BaseUIActivity; import butterknife.BindView; import butterknife.ButterKnife; /** * 地图选点 */ public class AMapSelectPointActivity extends BaseUIActivity implements LocationSource { public static String TITLE_TAG = "title_str";//标题key public static String RESULT_TAG = "result_str";//返回数据key String titleStr = "地图";//标题 @BindView(R.id.activity_amapselectpoint_map) MapView mMapView; @BindView(R.id.activity_amapselectpoint_text) TextView addressTxtView;//位置 AMap aMap;//地图 private UiSettings mUiSettings;//定义一个UiSettings对象 //声明AMapLocationClient类对象 public AMapLocationClient mLocationClient = null; //声明定位回调监听器 public AMapLocationListener mLocationListener; //声明AMapLocationClientOption对象 public AMapLocationClientOption mLocationOption = null; OnLocationChangedListener listener; MarkerOptions markerCenter = new MarkerOptions();//中心点 Marker marker;//中间 GeocodeSearch geocodeSearch;//地理位置查询 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentViewItem(R.layout.activity_amapselectpont); ButterKnife.bind(this); //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理 mMapView.onCreate(savedInstanceState); rightBtn.setTextColor(Color.parseColor("#fcc900")); initData(); showPage(); } /** * 实例化数据 */ private void initData() { initMap(); titleStr = getIntent().getStringExtra(TITLE_TAG); if (TextUtils.isEmpty(titleStr)){ titleStr = "地图"; } setPageName(titleStr); currentPageName = titleStr; setRightTxt(getString(R.string.str_common_finish), new View.OnClickListener() { @Override public void onClick(View view) { searchAddressByLat(marker.getPosition()); } }); } private void initMap() {//实例化Map geocodeSearch = new GeocodeSearch(this); //初始化地图变量 if (aMap == null) { aMap = mMapView.getMap(); } aMap.setMapType(AMap.MAP_TYPE_NORMAL); mUiSettings = aMap.getUiSettings();//实例化UiSettings类 mUiSettings.setZoomControlsEnabled(true); //定位按钮 aMap.setLocationSource(this);// 设置定位监听 mUiSettings.setMyLocationButtonEnabled(true); // 显示默认的定位按钮 aMap.setMyLocationEnabled(true);// 可触发定位并显示定位层 mUiSettings.setScaleControlsEnabled(true);//显示比例尺控件 mUiSettings.setAllGesturesEnabled(true); mUiSettings.setCompassEnabled(true);//指南针 // LatLng latLng = new LatLng(39.906901, 116.397972); // final Marker marker = aMap.addMarker(new MarkerOptions(). // position(latLng). // title("北京"). // snippet("DefaultMarker")); // final Marker marker = aMap.addMarker(new MarkerOptions()); // MarkerOptions markeroptions = new MarkerOptions(); // markeroptions.position(latLng); // markeroptions.title("当前位置"); // markeroptions.visible(true); // BitmapDescriptor bitmapDescriptor= BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.mipmap.positioning_normal)); // markeroptions.icon(bitmapDescriptor); // aMap.addMarker(markeroptions); mMapView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Log.e("mMapView","onGlobalLayout===---123"); marker = aMap.addMarker(new MarkerOptions()); Animation animation = new RotateAnimation(marker.getRotateAngle(), marker.getRotateAngle() + 720, 0, 0, 0); long duration = 1000L; animation.setDuration(duration); animation.setInterpolator(new LinearInterpolator()); marker.setAnimation(animation); marker.startAnimation(); marker.setPositionByPixels(mMapView.getWidth()/2, mMapView.getHeight()/2); } }); LatLng ll = new LatLng(34.6006623972045,108.97923588752748); markerCenter.position(ll); markerCenter.visible(true); markerCenter.title("中心点"); // BitmapDescriptor bitmapDescriptor= BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.mipmap.icon_nearby)); // markerCenter.icon(bitmapDescriptor); aMap.addMarker(markerCenter); //初始化AMapLocationClientOption对象 mLocationOption = new AMapLocationClientOption(); //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。 // mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving); mLocationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { if (listener != null) { listener.onLocationChanged(aMapLocation); } if (aMapLocation.getErrorCode() == 0) { //可在其中解析amapLocation获取相应内容。 Log.e("AMapSelectPointActivity", "aMapLocation=" + aMapLocation.getCity()); Log.e("AMapSelectPointActivity", "aMapLocation address=" + aMapLocation.getAddress()); } else { //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。 Log.e("AmapError", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo()); } } Log.e("AMapSelectPointActivity", "aMapLocation run onLocationChanged"); } }; //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //设置定位回调监听 mLocationClient.setLocationListener(mLocationListener); mLocationClient.setLocationOption(mLocationOption);//设置模式 aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { LatLng target = cameraPosition.target; System.out.println(target.latitude + "jinjin------" + target.longitude); } @Override public void onCameraChangeFinish(CameraPosition cameraPosition) { LatLng target = cameraPosition.target; System.out.println("changeFinish="+target.latitude + "jinjin------" + target.longitude); LatLng ll = new LatLng(target.latitude,target.longitude); markerCenter.position(ll); searchAddressByLat(ll); // markerCenter.visible(true); // markerCenter.title("中心点"); // BitmapDescriptor bitmapDescriptor= BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.mipmap.icon_nearby)); // markerCenter.icon(bitmapDescriptor); // aMap.addMarker(markerCenter); } }); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); mLocationClient.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理 mMapView.onResume(); //启动定位 mLocationClient.startLocation(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理 mMapView.onPause(); mLocationClient.stopLocation(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理 mMapView.onSaveInstanceState(outState); } @Override public void activate(OnLocationChangedListener onLocationChangedListener) { Log.e("AMapSelectPointActivity", "activate is run"); listener = onLocationChangedListener; } @Override public void deactivate() {//高德地图位置监听 listener = null; } private void searchAddressByLat(final LatLng latLng){ geocodeSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() { @Override public void onRegeocodeSearched(RegeocodeResult result, int rCode) { if (rCode == 1000) { if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) { String addressName = result.getRegeocodeAddress().getFormatAddress() + "附近"; aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); addressTxtView.setText(result.getRegeocodeAddress().getFormatAddress()); Toast.makeText(AMapSelectPointActivity.this, addressName,Toast.LENGTH_LONG).show(); } else { Toast.makeText(AMapSelectPointActivity.this, "未找到",Toast.LENGTH_LONG).show(); } } else { Toast.makeText(AMapSelectPointActivity.this, "失败",Toast.LENGTH_LONG).show(); } } @Override public void onGeocodeSearched(GeocodeResult geocodeResult, int i) { } }); LatLonPoint point = new LatLonPoint(latLng.latitude,latLng.longitude); RegeocodeQuery query = new RegeocodeQuery(point, 200,GeocodeSearch.AMAP); geocodeSearch.getFromLocationAsyn(query); } }

2016年12月15日 · 3 分钟 · 天边的星星

Android 使用开源库StickyGridHeaders来实现带sections和headers的GridView显示本地图片效果

转载(http://blog.csdn.net/xiaanming/article/details/20481185) 大家好!过完年回来到现在差不多一个月没写文章了,一是觉得不知道写哪些方面的文章,没有好的题材来写,二是因为自己的一些私事给耽误了,所以过完年的第一篇文章到现在才发表出来,2014年我还是会继续在CSDN上面更新我的博客,欢迎大家关注一下,今天这篇文章主要的是介绍下开源库StickyGridHeaders的使用,StickyGridHeaders是一个自定义GridView带sections和headers的Android库,sections就是GridView item之间的分隔,headers就是固定在GridView顶部的标题,类似一些Android手机联系人的效果,StickyGridHeaders的介绍在https://github.com/TonicArtos/StickyGridHeaders,与此对应也有一个相同效果的自定义ListView带sections和headers的开源库https://github.com/emilsjolander/StickyListHeaders,大家有兴趣的可以去看下,我这里介绍的是StickyGridHeaders的使用,我在Android应用方面看到使用StickyGridHeaders的不是很多,而是在Iphone上看到相册采用的是这种效果,于是我就使用StickyGridHeaders来仿照Iphone按照日期分隔显示本地图片 我们先新建一个Android项目StickyHeaderGridView,去https://github.com/TonicArtos/StickyGridHeaders下载开源库,为了方便浏览源码我直接将源码拷到我的工程中了 com.tonicartos.widget.stickygridheaders这个包就是我放StickyGridHeaders开源库的源码,com.example.stickyheadergridview这个包是我实现此功能的代码,类看起来还蛮多的,下面我就一一来介绍了 GridItem用来封装StickyGridHeadersGridView 每个Item的数据,里面有本地图片的路径,图片加入手机系统的时间和headerId **[java]** [view plain](http://blog.csdn.net/xiaanming/article/details/20481185#)[copy](http://blog.csdn.net/xiaanming/article/details/20481185#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/220204)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/220204/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span class="keyword">package</span> com.example.stickyheadergridview; - <span class="comment">/**</span> - <span class="comment"> * @blog http://blog.csdn.net/xiaanming</span> - <span class="comment"> * </span> - <span class="comment"> * @author xiaanming</span> - <span class="comment"> *</span> - <span class="comment"> */</span> - <span class="keyword">public</span> <span class="keyword">class</span> GridItem { - <span class="comment">/**</span> - <span class="comment"> * 图片的路径</span> - <span class="comment"> */</span> - <span class="keyword">private</span> String path; - <span class="comment">/**</span> - <span class="comment"> * 图片加入手机中的时间,只取了年月日</span> - <span class="comment"> */</span> - <span class="keyword">private</span> String time; - <span class="comment">/**</span> - <span class="comment"> * 每个Item对应的HeaderId</span> - <span class="comment"> */</span> - <span class="keyword">private</span> <span class="keyword">int</span> headerId; - - <span class="keyword">public</span> GridItem(String path, String time) { - <span class="keyword">super</span>(); - <span class="keyword">this</span>.path = path; - <span class="keyword">this</span>.time = time; - } - - <span class="keyword">public</span> String getPath() { - <span class="keyword">return</span> path; - } - <span class="keyword">public</span> <span class="keyword">void</span> setPath(String path) { - <span class="keyword">this</span>.path = path; - } - <span class="keyword">public</span> String getTime() { - <span class="keyword">return</span> time; - } - <span class="keyword">public</span> <span class="keyword">void</span> setTime(String time) { - <span class="keyword">this</span>.time = time; - } - - <span class="keyword">public</span> <span class="keyword">int</span> getHeaderId() { - <span class="keyword">return</span> headerId; - } - - <span class="keyword">public</span> <span class="keyword">void</span> setHeaderId(<span class="keyword">int</span> headerId) { - <span class="keyword">this</span>.headerId = headerId; - } - - - } 图片的路径path和图片加入的时间time 我们直接可以通过ContentProvider获取,但是headerId需要我们根据逻辑来生成。 ...

2015年3月7日 · 13 分钟 · 天边的星星

Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

转载:http://blog.csdn.net/xiaanming/article/details/18730223 写这篇文章之前,先简单说几句,首先是先恭喜下自己获得了2013年的博客之星称号,很意外也很开心,自己是从2013年开始写博客,那时候也不知道怎么写,我从小就不喜欢写日记,作文什么的,所以刚开始都是贴代码,也没有人看,后面慢慢的,写的文章被推荐博客首页和CSDN首页(这里也要小小的感谢下小编MM),访问量逐渐的多了起来,有更多的人看我的文章,这也使自己有了继续写文章的动力,也希望我写的东西对大家有点帮助吧,在2014年我会继续在CSDN上面写博客,然后是感谢博客之星给我投票支持我的朋友们,谢谢你们支持我的每一票,最后就是2014春节马上就到了,提前祝福大家新年快乐,工作顺利,事事顺心! 回到主题,之前群里面有朋友问我,有没有关于本地图片选择的Demo,类似微信的效果,他说网上没有这方面的Demo,问我能不能写一篇关于这个效果的Demo,于是我研究了下微信的本地图片选择的Demo,自己仿照的写了下分享给大家,希望对以后有这样子需求的朋友有一点帮助吧,主要使用的是ContentProvider扫描手机中的图片,并用GridView将图片显示出来,关于GridView和ListView显示图片的问题,一直是一个很头疼的问题,因为我们手机的内存有限,手机给每个应用程序分配的内存也有限,所以图片多的情况下很容易伴随着OOM的发生,不过现在也有很多的开源的图片显示框架,对显示很多图片进行了优化,大家有兴趣的可以去了解了解,今天我的这篇文章使用的是LruCache这个类(之前写了一篇使用LruCache加载网络图片的Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅)以及对图片进行相对应的裁剪,这样也可以尽量的避免OOM的发生,我们先看下微信的效果吧 接下来我们就来实现这些效果吧,首先我们新建一个项目,取名ImageScan 首先我们先看第一个界面吧,使用将手机中的图片扫描出来,然后根据图片的所在的文件夹将其分类出来,并显示所在文件夹里面的一张图片和文件夹中图片个数,我们根据界面元素(文件夹名, 文件夹图片个数,文件夹中的一张图片)使用一个实体对象ImageBean来封装这三个属性 **[java]** [view plain](http://blog.csdn.net/xiaanming/article/details/18730223#)[copy](http://blog.csdn.net/xiaanming/article/details/18730223#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/169891)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/169891/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span class="keyword">package</span> com.example.imagescan; - - <span class="comment">/**</span> - <span class="comment"> * GridView的每个item的数据对象</span> - <span class="comment"> * </span> - <span class="comment"> * @author len</span> - <span class="comment"> *</span> - <span class="comment"> */</span> - <span class="keyword">public</span> <span class="keyword">class</span> ImageBean{ - <span class="comment">/**</span> - <span class="comment"> * 文件夹的第一张图片路径</span> - <span class="comment"> */</span> - <span class="keyword">private</span> String topImagePath; - <span class="comment">/**</span> - <span class="comment"> * 文件夹名</span> - <span class="comment"> */</span> - <span class="keyword">private</span> String folderName; - <span class="comment">/**</span> - <span class="comment"> * 文件夹中的图片数</span> - <span class="comment"> */</span> - <span class="keyword">private</span> <span class="keyword">int</span> imageCounts; - - <span class="keyword">public</span> String getTopImagePath() { - <span class="keyword">return</span> topImagePath; - } - <span class="keyword">public</span> <span class="keyword">void</span> setTopImagePath(String topImagePath) { - <span class="keyword">this</span>.topImagePath = topImagePath; - } - <span class="keyword">public</span> String getFolderName() { - <span class="keyword">return</span> folderName; - } - <span class="keyword">public</span> <span class="keyword">void</span> setFolderName(String folderName) { - <span class="keyword">this</span>.folderName = folderName; - } - <span class="keyword">public</span> <span class="keyword">int</span> getImageCounts() { - <span class="keyword">return</span> imageCounts; - } - <span class="keyword">public</span> <span class="keyword">void</span> setImageCounts(<span class="keyword">int</span> imageCounts) { - <span class="keyword">this</span>.imageCounts = imageCounts; - } - - } 接下来就是主界面的布局啦,上面的导航栏我没有加进去,只有下面的GridView,所以说主界面布局中只有一个GridView ...

2015年3月7日 · 17 分钟 · 天边的星星

Android 使用开源库StickyGridHeaders来实现带sections和headers的GridView显示本地图片效果

转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/20481185),请尊重他人的辛勤劳动成果,谢谢! 大家好!过完年回来到现在差不多一个月没写文章了,一是觉得不知道写哪些方面的文章,没有好的题材来写,二是因为自己的一些私事给耽误了,所以过完年的第一篇文章到现在才发表出来,2014年我还是会继续在CSDN上面更新我的博客,欢迎大家关注一下,今天这篇文章主要的是介绍下开源库StickyGridHeaders的使用,StickyGridHeaders是一个自定义GridView带sections和headers的Android库,sections就是GridView item之间的分隔,headers就是固定在GridView顶部的标题,类似一些Android手机联系人的效果,StickyGridHeaders的介绍在https://github.com/TonicArtos/StickyGridHeaders,与此对应也有一个相同效果的自定义ListView带sections和headers的开源库https://github.com/emilsjolander/StickyListHeaders,大家有兴趣的可以去看下,我这里介绍的是StickyGridHeaders的使用,我在Android应用方面看到使用StickyGridHeaders的不是很多,而是在Iphone上看到相册采用的是这种效果,于是我就使用StickyGridHeaders来仿照Iphone按照日期分隔显示本地图片 我们先新建一个Android项目StickyHeaderGridView,去https://github.com/TonicArtos/StickyGridHeaders下载开源库,为了方便浏览源码我直接将源码拷到我的工程中了 com.tonicartos.widget.stickygridheaders这个包就是我放StickyGridHeaders开源库的源码,com.example.stickyheadergridview这个包是我实现此功能的代码,类看起来还蛮多的,下面我就一一来介绍了 GridItem用来封装StickyGridHeadersGridView 每个Item的数据,里面有本地图片的路径,图片加入手机系统的时间和headerId **[java]** [view plain](http://blog.csdn.net/xiaanming/article/details/20481185#)[copy](http://blog.csdn.net/xiaanming/article/details/20481185#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/220204)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/220204/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span class="keyword">package</span> com.example.stickyheadergridview; - <span class="comment">/**</span> - <span class="comment"> * @blog http://blog.csdn.net/xiaanming</span> - <span class="comment"> * </span> - <span class="comment"> * @author xiaanming</span> - <span class="comment"> *</span> - <span class="comment"> */</span> - <span class="keyword">public</span> <span class="keyword">class</span> GridItem { - <span class="comment">/**</span> - <span class="comment"> * 图片的路径</span> - <span class="comment"> */</span> - <span class="keyword">private</span> String path; - <span class="comment">/**</span> - <span class="comment"> * 图片加入手机中的时间,只取了年月日</span> - <span class="comment"> */</span> - <span class="keyword">private</span> String time; - <span class="comment">/**</span> - <span class="comment"> * 每个Item对应的HeaderId</span> - <span class="comment"> */</span> - <span class="keyword">private</span> <span class="keyword">int</span> headerId; - - <span class="keyword">public</span> GridItem(String path, String time) { - <span class="keyword">super</span>(); - <span class="keyword">this</span>.path = path; - <span class="keyword">this</span>.time = time; - } - - <span class="keyword">public</span> String getPath() { - <span class="keyword">return</span> path; - } - <span class="keyword">public</span> <span class="keyword">void</span> setPath(String path) { - <span class="keyword">this</span>.path = path; - } - <span class="keyword">public</span> String getTime() { - <span class="keyword">return</span> time; - } - <span class="keyword">public</span> <span class="keyword">void</span> setTime(String time) { - <span class="keyword">this</span>.time = time; - } - - <span class="keyword">public</span> <span class="keyword">int</span> getHeaderId() { - <span class="keyword">return</span> headerId; - } - - <span class="keyword">public</span> <span class="keyword">void</span> setHeaderId(<span class="keyword">int</span> headerId) { - <span class="keyword">this</span>.headerId = headerId; - } - - - } 图片的路径path和图片加入的时间time 我们直接可以通过ContentProvider获取,但是headerId需要我们根据逻辑来生成。 ...

2015年1月20日 · 13 分钟 · 天边的星星

Mac 下面配置XMAPP集成开发环境 Alias别名方法

XMAPP Alias别名配置在windows上简单很,网上很多方法都可以实现,但是在 mac上面 一直都是403没有权限,这个问题困扰了1天,最后在同事(linux大神)的帮助下,终于解决了这个蛋疼的问题,让用Mac的小白们,也能方便的使用Mac开发PHP程序。废话不多说直接上步骤 XAMPP官方下载地址:https://www.apachefriends.org/zh_cn/index.html 操作步骤 1.安装好Mac最新的XAMPP。 2.配置etc/extra/httpd-xampp.conf 修改成 把下面的local修改成 all granted <LocationMatch “^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))”> #Require local Require all granted ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var 3.配置etc/httpd.conf 添加下面别名 由于tmp文件所有用户有权限范围,直接配置下面就可以访问tmp目录,但是其他的目录还是会受到权限问题。 Alias /abcd/ “/tmp/aaa/” <Directory “/tmp/aaa/”> Options Indexes MultiViews Require all granted Alias /php “/Users/jason/Documents/php_workspace” <Directory “/Users/jason/Documents/php_workspace”> Options Indexes MultiViews Require all granted 4.修改Apache的启动用户 通过命令 id jason找到jason的所在组,修改成下面对应的内容。 也可以把/Users/jason/Documents/php_workspace这个目录赋值给默认用户访问权限(没有亲测)。 # # If you wish httpd to run as a different user or group, you must run ...

2014年11月19日 · 1 分钟 · 天边的星星

关于android webview里HTML5的地理位置定位,在别的浏览器中打开可以定位,在我自己的webview却不能

我也遇到了同样的问题,我查看了下源码解决了,主要代码如下: //启用数据库 webSettings.setDatabaseEnabled(true); String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath(); //启用地理定位 webSettings.setGeolocationEnabled(true); //设置定位的数据库路径 webSettings.setGeolocationDatabasePath(dir); //最重要的方法,一定要设置,这就是出不来的主要原因 webSettings.setDomStorageEnabled(true) //配置权限(同样在WebChromeClient中实现) public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); super.onGeolocationPermissionsShowPrompt(origin, callback); } 配置权限: &lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt; &lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;

2014年10月19日 · 1 分钟 · 天边的星星

Html5 Geolocation获取地理位置信息

Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置。基于此特性可以开发基于位置的服务应用。在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用。 Html5获取地理位置信息是通过Geolocation API提供,使用其getCurrentPosition方法,此方法中有三个参数,分别是成功获取到地理位置信息时所执行的回调函数,失败时所执行的回调函数和可选属性配置项。 如下Demo演示了通过Geolocation获取地理位置信息,并在百度地图上显示当前位置(通过调用百度地图API)。实验结果发现位置被定位到了大学城内环东四路入口处,与本人所在位置(华工学生宿舍)偏差还是有点大的,达到200-300米左右。 代码如下所示(其中convertor.js为百度地图提供的坐标转化文件): ![复制代码](http://common.cnblogs.com/images/copycode.gif) <span style="color: #008080;"> 1</span> <span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE html</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 2</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 3</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 4</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span>H5地理位置Demo<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 5</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script </span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">="http://api.map.baidu.com/api?v=1.3"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 6</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 7</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;"> src</span><span style="color: #0000ff;">="convertor.js"</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 8</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;"> 9</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;">10</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;">11</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="map"</span><span style="color: #ff0000;"> style</span><span style="color: #0000ff;">="width:600px; height:400px"</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;">12</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;">13</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;">14</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;">15</span> <span style="color: #0000ff;">if</span> (window.navigator.geolocation) { <span style="color: #008080;">16</span> <span style="color: #0000ff;">var</span> options = { <span style="color: #008080;">17</span> enableHighAccuracy: <span style="color: #0000ff;">true</span>, <span style="color: #008080;">18</span> }; <span style="color: #008080;">19</span> window.navigator.geolocation.getCurrentPosition(handleSuccess, handleError, options); <span style="color: #008080;">20</span> } <span style="color: #0000ff;">else</span> { <span style="color: #008080;">21</span> alert("浏览器不支持html5来获取地理位置信息"); <span style="color: #008080;">22</span> } <span style="color: #008080;">23</span> <span style="color: #008080;">24</span> <span style="color: #0000ff;">function</span> handleSuccess(position){ <span style="color: #008080;">25</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 获取到当前位置经纬度 本例中是chrome浏览器取到的是google地图中的经纬度</span> <span style="color: #008080;">26</span> <span style="color: #0000ff;">var</span> lng = position.coords.longitude; <span style="color: #008080;">27</span> <span style="color: #0000ff;">var</span> lat = position.coords.latitude; <span style="color: #008080;">28</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 调用百度地图api显示</span> <span style="color: #008080;">29</span> <span style="color: #0000ff;">var</span> map = <span style="color: #0000ff;">new</span> BMap.Map("map"); <span style="color: #008080;">30</span> <span style="color: #0000ff;">var</span> ggPoint = <span style="color: #0000ff;">new</span> BMap.Point(lng, lat); <span style="color: #008080;">31</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 将google地图中的经纬度转化为百度地图的经纬度</span> <span style="color: #008080;">32</span> BMap.Convertor.translate(ggPoint, 2, <span style="color: #0000ff;">function</span>(point){ <span style="color: #008080;">33</span> <span style="color: #0000ff;">var</span> marker = <span style="color: #0000ff;">new</span> BMap.Marker(point); <span style="color: #008080;">34</span> map.addOverlay(marker); <span style="color: #008080;">35</span> map.centerAndZoom(point, 15); <span style="color: #008080;">36</span> }); <span style="color: #008080;">37</span> } <span style="color: #008080;">38</span> <span style="color: #008080;">39</span> <span style="color: #0000ff;">function</span> handleError(error){ <span style="color: #008080;">40</span> <span style="color: #008080;">41</span> } <span style="color: #008080;">42</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span> <span style="color: #008080;">43</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span> ![复制代码](http://common.cnblogs.com/images/copycode.gif) convertor.js文件: ...

2014年9月22日 · 4 分钟 · 天边的星星

基于 html5 geolocation来获取经纬度地址

以前如果要获取互联网用户所在地都是根据用户的IP地址来获取地理位置,这样获取到的数据和真实数据有很大的偏差。为了获取更加精确的位置,可以使用了html5的geolocation来获取经纬度,然后再获取所在地理位置,如何获取,我在下面会说到。先说下基本概念。 Geolocation在的navigator 对象中,我们可以通过 navigator.geolocation 来使用它。不支持 geolocation 的浏览器并不包含这一对象,那么可以通过下面的代码来做能力检测,对不同的浏览器做不同的处理。在访问 geolocation 对象时,即调用 geolocation 下面的方法时,浏览器会弹出提示,询问用户是否许可网站提供的位置服务,只有在得到用户许可过后,服务才会继续,否则将被停止。 常用的navigator.geolocation对象有以下三种方法: 获取当前地理位置:navigator.geolocation.getCurrentPosition(success_callback_function, error_callback_function, position_options) 持续获取地理位置:navigator.geolocation.watchPosition(success_callback_function, error_callback_function, position_options) 清除持续获取地理位置事件:navigator.geolocation.clearWatch(watch_position_id) 参数position_options是配置项,由JSON格式传入: enableHighAccuracy:true/false,它将告诉浏览器是否启用高精度设备,所谓的高精度设备包含但不局限于前面所提到的 GPS 和 WIFI,值为 true 的时候,浏览器会尝试启用这些设备,默认指为 true,在这种情况下,浏览器会尽可能地进行更为精确的查询,简单地说,如果用户有可用的 GPS 设备,会返回 GPS 设备的查询结果,IP 是最后的选择,对于移动设备来说,网络接入点(基站)或许成为另一个选择,对此我还没有完全了解,但根据测试,即时没有任何额外功能的手机,也能够得到更为精确的查询结果。 maximumAge:单位毫秒,告诉设备缓存时间,主要用于设备的省电或者节省带宽方面。 timeout:单位毫秒,超时事件,获取位置信息时超出设定的这个时长,将会触发错误,捕获错误的函数将被调用,并且错误码指向TIMEOUT。 [?](http://www.cnblogs.com/zzcflying/archive/2012/08/30/2663540.html#) <table border="0" cellspacing="0" cellpadding="0"> <tr> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `var` `position_option = {` </div> <div class="line number2 index1 alt1"> ` ``enableHighAccuracy: ``true``,` </div> <div class="line number3 index2 alt2"> ` ``maximumAge: 30000,` </div> <div class="line number4 index3 alt1"> ` ``timeout: 20000` </div> <div class="line number5 index4 alt2"> ` ``};` </div> <div class="line number6 index5 alt1"> `navigator.geolocation.getCurrentPosition(getPositionSuccess, getPositionError, position_option);` </div> </div> </td> </tr> </table> [?](http://www.cnblogs.com/zzcflying/archive/2012/08/30/2663540.html#) <table border="0" cellspacing="0" cellpadding="0"> <tr> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `function` `getPositionSuccess( position ){` </div> <div class="line number2 index1 alt1"> ` ``var` `lat = position.coords.latitude;` </div> <div class="line number3 index2 alt2"> ` ``var` `lng = position.coords.longitude;` </div> <div class="line number4 index3 alt1"> ` ``alert( ``"您所在的位置: 纬度"` `+ lat + ``",经度"` `+ lng );` </div> <div class="line number5 index4 alt2"> ` ``if``(``typeof` `position.address !== ``"undefined"``){` </div> <div class="line number6 index5 alt1"> ` ``var` `country = position.address.country;` </div> <div class="line number7 index6 alt2"> ` ``var` `province = position.address.region;` </div> <div class="line number8 index7 alt1"> ` ``var` `city = position.address.city;` </div> <div class="line number9 index8 alt2"> ` ``alert(``' 您位于 '` `+ country + province + ``'省'` `+ city +``'市'``);` </div> <div class="line number10 index9 alt1"> ` ``}` </div> <div class="line number11 index10 alt2"> `}` </div> </div> </td> </tr> </table> coords其他返回信息: ...

2014年9月22日 · 2 分钟 · 天边的星星