写入手机功能——经纬度及时间信息持续写入手机存储
新的知识及脑图
代码解释基本都在脑图当中,自行查看
RandomAccessFile raf = new RandomAccessFile(file,"rwd");//随机访问文件类,设置为rwd方式,可读取写入
raf.seek(file.length());
raf.write(strContent.getBytes());
raf.close();
- 获得时间代码:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-M-d HH:mm:ss");//设置获取时间格式
Date curDate = new Date(System.currentTimeMillis());
String timeNow = formatter.format(curDate);
Intent intent = new Intent(MainActivity.this,NewFileActivity.class);
startActivity(intent);
- 获得EditText内容:
EditText editText = (EditText)findViewById(R.id.input_fileName);//获取EditText对象
fileName = editText.getText().toString();//获取EditText中内容
NewFileActivity newFileActivity = new NewFileActivity();
fileName = newFileActivity.getFileName();
脑图
代码
- MainActivity.java
package com.example.record;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button)findViewById(R.id.btn_recordLocation);
btn1.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,NewFileActivity.class);
startActivity(intent);
}
});
}
}
- NewFileActivity.java
package com.example.record;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import javax.security.auth.login.LoginException;
public class NewFileActivity extends AppCompatActivity {
private static String fileName = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_file);
Button btn2 = (Button)findViewById(R.id.btn_assure);
btn2.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(NewFileActivity.this,RecordActivity.class);//跳转到定位界面
startActivity(intent);
EditText editText = (EditText)findViewById(R.id.input_fileName);//获取EditText对象
fileName = editText.getText().toString();//获取EditText中内容
Log.i("testOutput",fileName);
}
});
}
public String getFileName(){
return fileName;
}
}
- FileOperations.java
package com.example.record;
import android.util.Log;
import java.io.File;
import java.io.RandomAccessFile;
public class FileOperations {
private static final int REQUEST_EXTERNAL_STORAGE = 1;
//生成文件夹,根目录
public static void makeRootDirectory(String filePath){
File file = null;
try{
file = new File(filePath);
//不存在就新建
if(!file.exists()){//若此文件实例不存在,则需要创建
file.mkdir();//创建指定的目录,返回一个true或者false值。
Log.i("test","make the RootDirectory");
}
}catch (Exception e){
Log.i("error",e + "");
}
}
//判断文件是否存在
public static boolean fileIsExists(String filePath) {
try {
File f = new File(filePath);//创建一个file的实例
if(!f.exists()){
return false;
}
} catch(Exception e) {
return false;
}
return true;
}
//生成文件
private static File makeFilePath(String filePath,String fileName){
File file = null;
makeRootDirectory(filePath);//此举:如果没创建文件夹则创建
try{
file = new File(filePath + fileName);//创建文件,需要路径+文件名
if(!file.exists()){
file.createNewFile();//如果文件不存在则创建该文件
// Log.i("test","produce the file");
}
} catch (Exception e){
e.printstacktrace();
}
return file;
}
public static void writeData(String url,String name,String content){
String filePath = url;
String fileName = name + ".txt";//分别定义了文件的路径以及文件的名称
writeTxtToFile(content,filePath,fileName);//将信息写入方法
// Log.i("test","write message");
}
//字符串写入文本文件
private static void writeTxtToFile(String strcontent,String filePath,String fileName){
makeFilePath(filePath,fileName);//生成文件
String strFilePath = filePath + fileName;
//每次写入之前都进行换行
String strContent = strcontent + "\r\n";//换行加顶头
try {
File file = new File(strFilePath);//创建文件实例
if(!file.exists()){//如果该文件不存在,则创建
// Log.d("TestFile","create the file" + strFilePath);
file.getParentFile().mkdirs();
file.createNewFile();
}
RandomAccessFile raf = new RandomAccessFile(file,"rwd");//随机访问文件类,设置为rwd方式,可读取写入
raf.seek(file.length());
raf.write(strContent.getBytes());
raf.close();
} catch(Exception e){
Log.e("TestFile","Error on write File:" + e);
}
}
}
- RecordActivity.java
package com.example.record;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class RecordActivity extends AppCompatActivity {
public LocationClient mLocationClient;
private TextView positionText;
private MapView mapView;
private BaiduMap baiduMap;
private boolean isFirstLocate = true;
private static final String TAG = "MainActivity";
private static String filePath = "/storage/emulated/0/Download/info/";
private static String fileName = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());//得到结果时是会调用这个方法的
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_record);
mapView = (MapView) findViewById(R.id.bmapView);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
//将三种请求权限先放至list在放入String
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(RecordActivity.this, Manifest.
permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(RecordActivity.this, Manifest.
permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(RecordActivity.this, Manifest.
permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()) {
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(RecordActivity.this, permissions, 1);//为三中权限实现一次性申请
} else {
requestLocation();
}
}
private void requestLocation() {
initLocation();
mLocationClient.start();//结果会回调到之前的监听器当中即MyLocationListener
}
private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setScanSpan(1000);//每秒更新位置
option.setCoorType("bd09ll");//默认值是gcj02,中国坐标偏移标准,google map,高德、腾讯使用
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置传感器类型,其实也就是GPS定位,但无gps信号时,WiFi可以使用
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
// option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
mLocationClient.setLocoption(option);
}
private void navigateto(BDLocation location) {//导航定位方法
if (isFirstLocate) {//是否为第一次定位
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());//包含经纬度
// Log.i("Location"," 经度: " + location.getLongitude() + " 纬度 "
// + location.getLatitude());//此行作用是查看坐标是否会隔几秒刷新一次
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);//此为设置地图的中心
baiduMap.animateMapStatus(update);//以动画方式更新地图状态,动画耗时 300 ms
update = MapStatusUpdateFactory.zoomTo(16f);//设置地图缩放级别
baiduMap.animateMapStatus(update);
isFirstLocate = false;//取消设置地图为中心
//isFirstLocate = true;//确保每次地图中心都为自己现在的位置。
}
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();//封装设备现在的位置
locationBuilder.longitude(location.getLongitude());
locationBuilder.latitude(location.getLatitude());
MyLocationData locationData = locationBuilder.build();
baiduMap.setMyLocationData(locationData);//设置定位数据
writetoFile(location);//调用方法,保留经纬度及时间信息到文本文档当中。
}
private static void writetoFile(BDLocation location) {
NewFileActivity newFileActivity = new NewFileActivity();
fileName = newFileActivity.getFileName();
/**
* 以下是实现获取系统时间
*/
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-M-d HH:mm:ss");//设置获取时间格式
Date curDate = new Date(System.currentTimeMillis());
String timeNow = formatter.format(curDate);
/**
* 以下的功能是将信息存入文本文档,调用了FileOperations类
*/
FileOperations.makeRootDirectory(filePath);//制作文件夹,根目录一个意思
String latLocation = Double.toString(location.getLatitude());//经纬度从double转为String类型
String lonLocation = Double.toString(location.getLongitude());
String locationInfo = lonLocation + " " + latLocation + " " + timeNow;//字符串连接,先经度后纬度,再接上时间
if (!FileOperations.fileIsExists(filePath + fileName + ".txt")) {//当文件不存在时,就创建文件并且输入信息
FileOperations.writeData(filePath, fileName, locationInfo);
} else {//当文件已经存在时,将继续输入信息,并且加一个换行,顶头
FileOperations.writeData(filePath, fileName, locationInfo);
}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
baiduMap.setMyLocationEnabled(false);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "必须同意所有权限才能使用本程序",
Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
} else {
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location.getLocType() == BDLocation.TypeGpsLocation
|| location.getLocType() == BDLocation.TypeNetWorkLocation) {//当定位的类型属于GPS或者网络定位时,开启此方法navigateto
navigateto(location);
}
}
}
}
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="100dp"
android:text="这是主界面"
android:textSize="30dp"/>
<Button
android:id="@+id/btn_recordLocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="170dp"
android:text="记录位置"
android:textSize="30dp"/>
</LinearLayout>
- activity_new_file.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NewFileActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:layout_gravity="center"
android:text="文件命名"
android:textSize="30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:layout_gravity="center"
android:text="文件命名规范"
android:textSize="22dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30sp"
android:layout_gravity="center"
android:text="时间 - 地点 - 次第"
android:textSize="20dp"/>
<EditText
android:id="@+id/input_fileName"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_gravity="center"
android:textSize="22dp"/>
<Button
android:id="@+id/btn_assure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:text="确定并跳转"
android:textSize="22dp"/>
</LinearLayout>
- activity_record.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RecordActivity">
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
</LinearLayout>
- AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.record">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYstemS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".RecordActivity"></activity>
<activity android:name=".NewFileActivity" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<Meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="G6HPgwZdj4NCDQP8GztElLgDqGioeePR" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
</application>
</manifest>
思路过程
1.先做到提前固定建立一个文件夹,以及固定文本文档。
2.实现自己编写信息并且将其写入手机,是死的信息
3.配合经纬度的获取,将经纬度信息输入到该文本文档
4.获取当时的时间并且也写入文本文档。
5.将经纬度信息以及时间糅合起来写入文本文档,实现每秒都记录位置点以及时间
6.在MainActivity当中,设计功能键,记录用户位置信息。然后先去解决从主界面跳转到记录用户位置信息,出现一个界面让用户输入存储位置时间信息的文本文档。然后点击确定就跳转到百度地图定位加记录位置的Activity
功能及介绍(必看)
*想法:在主界面设置功能键,然后通过点击这个功能键,跳转到命名存储位置及时间信息的txt的界面,通过输入一个txt文件名来创建一个txt文件存储经度,纬度以及时间信息。再点击确定按钮,跳转到百度地图组件的页面,边定位边将信息存入手机存储。
难点及解决方法
- 1.需要实现跳转界面
跳转代码已贴,见上 - 2.需要获取EditText中内容,并在百度地图所在的Activity中调用其String值
代码已贴,见上
因为静态成员不能直接访问非静态成员,所以在RecordActivity的方法中,需要创建实例来引用NewFileActivity当中所获取到的EditText值,并且有设置全局静态变量 - 3.需要获取时间信息
代码已贴,见上 - 4.需要持续将信息写入到存储当中,重点在Record的代码中
也就是writetoFile()方法当中的if以及else处理,解释如下:if是判断文件是否存在,如果不存在的话需要创建这个文本文档,else即当文件存在的情况下,需要进一步往这个文件里头写入信息。 - 5.向手机存储写入信息,在FileOperations.java当中
具体的语句功能介绍,见脑图