在前面博学谷
项目的基础上进行改善和增加新功能
源码资源下载:https://download.csdn.net/download/hyh17808770899/19844673
博学谷
的第四个新功能:在“我”的界面右上角点击签到
1、修改XML文件
(1)res目录下的layout文件夹中的main_view_myinfo.xml
中17行添加代码:
<TextView
android:id="@+id/tv_sign_in"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_gravity="right"
android:background="@drawable/sign_in"
android:textColor="#3b3b3b"/>
(2)res目录下的drawable文件夹中新建btn_sign_bg_selector.xml文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/btn_sign_bg_enable" android:state_enabled="true"/>
<item android:drawable="@drawable/btn_sign_bg_unable"/>
</selector>
(3)res目录下的layout文件夹中新建activity_check.xml文件,具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg_all"
android:orientation="vertical" >
<include layout="@layout/main_title_bar" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:drawableLeft="@drawable/ic_local"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:padding="10dp"
android:text="正在进行定位..." >
</TextView>
<LinearLayout
android:id="@+id/ll_popup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffeeeeee"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff" >
<TextView
android:id="@+id/popupwindow_calendar_month"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:textColor="#000"
android:textSize="18sp" />
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
android:gravity="center"
android:background="@drawable/bg_check"/>
</RelativeLayout>
<Button
android:id="@+id/btn_signIn"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:background="@drawable/btn_sign_bg_selector"
android:text="签到"
android:textColor="@android:color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
2、逻辑代码
(1)china.ynyx.heyunhui.activity
包中新建CheckActivity.java
文件,具体代码如下:
package china.ynyx.heyunhui.activity;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import china.ynyx.heyunhui.R;
import china.ynyx.heyunhui.bean.LocationInfo;
import china.ynyx.heyunhui.utils.Location;
public class CheckActivity extends Activity implements OnClickListener{
private RelativeLayout rl_title_bar;
private TextView mtitleTextView;
private Button mSign;
private TextView mLocation;
private TextView mBlack;
Location location;
String address;
String loc;
String lon;
String lat;
String latitude;// 纬度
String longitude;// 经度
String add;
String locDescribution;
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
LocationInfo info = (LocationInfo) msg.obj;
latitude = info.getLatitude();
longitude = info.getLongitude();
add = info.getAdd();
locDescribution = info.getLocDescribution();
if (locDescribution == null || locDescribution.equals("")
|| longitude == null || longitude.equals("")
|| latitude == null || latitude.equals("")) {
return;
}
if (add == null || add.equals("")) {
return;
}
mLocation.setText(add + locDescribution);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check);
initView();
initData();
}
private void initView() {
mtitleTextView = (TextView) findViewById(R.id.tv_main_title);
mSign = (Button) findViewById(R.id.btn_signIn);
mLocation = (TextView) findViewById(R.id.tv_location);
mBlack = (TextView) findViewById(R.id.tv_back);
mBlack.setOnClickListener(this);
mSign.setOnClickListener(this);
}
private void initData() {
mtitleTextView.setText("签 到");
rl_title_bar = (RelativeLayout) findViewById(R.id.title_bar);
rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));
location = new Location(handler, CheckActivity.this);
location.start();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.tv_back:// 返回
this.finish();
break;
case R.id.btn_signIn:// 签到
Toast.makeText(CheckActivity.this,"签到成功",Toast.LENGTH_SHORT).show();
this.finish();
break;
}
}
}
(2)china.ynyx.heyunhui.bean
包中新建LocationInfo.java
文件,具体代码如下:
package china.ynyx.heyunhui.bean;
public class LocationInfo {
String latitude;// 纬度
String longitude;// 经度
String add;
String locDescribution;
String city;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getLatitude() {
return latitude;
}
public void setLatitude(String latitude) {
this.latitude = latitude;
}
public String getLongitude() {
return longitude;
}
public void setLongitude(String longitude) {
this.longitude = longitude;
}
public String getAdd() {
return add;
}
public void setAdd(String add) {
this.add = add;
}
public String getLocDescribution() {
return locDescribution;
}
public void setLocDescribution(String locDescribution) {
this.locDescribution = locDescribution;
}
}
(3)china.ynyx.heyunhui.utils
包中新建Location.java
文件,具体代码如下:
package china.ynyx.heyunhui.utils;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import china.ynyx.heyunhui.bean.LocationInfo;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
public class Location {
Handler handler;
public LocationClient mLocationClient = null;
public BDLocationListener myListener;
LocationInfo info;
Context context;
@SuppressWarnings("deprecation")
public Location(Handler handler, Context context) {
this.handler = handler;
this.context = context;
info = new LocationInfo();
myListener = new MyLocationListener();
// 第一步,初始化LocationClient类
mLocationClient = new LocationClient(context); // 声明LocationClient类
mLocationClient.registerLocationListener(myListener); // 注册监听函数
initLocation();
}
// 第四步,开始定位
public void start() {
mLocationClient.start();
}
// 第五步,停止定位
public void stop() {
mLocationClient.stop();
}
// 第二步,配置定位SDK参数
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);
// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");
// 可选,默认gcj02,设置返回的定位结果坐标系
int span = 0;
option.setScanSpan(span);
// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);
// 可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);
// 可选,默认false,设置是否使用gps
option.setLocationNotify(true);
// 可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);
// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);
// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);
// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);
// 可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);
// 可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
mLocationClient.setLocOption(option);
}
// 第三步,实现BDLocationListener接口
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
String latitude = String.valueOf(location.getLatitude());
String longitude = String.valueOf(location.getLongitude());
String add = location.getAddrStr();
String locDescribution = location.getLocationDescribe();
info.setLatitude(String.valueOf(location.getLatitude()));
info.setLongitude(String.valueOf(location.getLongitude()));
info.setAdd(location.getAddrStr());
info.setLocDescribution(location.getLocationDescribe());
info.setCity(location.getCity());
Log.i("location", "经度:" + longitude + "\n纬度:" + latitude + "\n位置:"
+ location + locDescribution);
Message msg = new Message();
msg.what = 0;
msg.obj = info;
handler.sendMessage(msg);
}
public void onConnectHotSpotMessage(String arg0, int arg1) {
// TODO Auto-generated method stub
}
}
}
3、在AndroidManifest.xml
文件
24行添加如下代码:
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>