基于eclipse的android项目实战—博学谷(新功能四)签到

本篇博客介绍了在博学谷项目中新增的签到功能,包括UI设计、定位逻辑实现及权限配置等内容。通过自定义XML布局实现签到按钮与定位提示,利用百度地图API完成地理位置定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面博学谷项目的基础上进行改善和增加新功能

源码资源下载: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>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨云21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值