天天看点

Android信息写入手机之经纬度信息持续写入手机新的知识及脑图代码思路过程功能及介绍(必看)运行演示

写入手机功能——经纬度及时间信息持续写入手机存储

  • 新的知识及脑图
    • 脑图
  • 代码
  • 思路过程
  • 功能及介绍(必看)
    • 难点及解决方法
  • 运行演示

新的知识及脑图

代码解释基本都在脑图当中,自行查看

  • 文件写入代码:
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);
           
  • 界面跳转代码:

    注意,Activity文件是需要根据自己实际情况更换的

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中内容
           
  • 在百度地图的Activity中调用EditText中的信息需要创建实例化如下
NewFileActivity newFileActivity = new NewFileActivity();
fileName = newFileActivity.getFileName();
           

脑图

Android信息写入手机之经纬度信息持续写入手机新的知识及脑图代码思路过程功能及介绍(必看)运行演示

代码

  • 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当中

    具体的语句功能介绍,见脑图

运行演示

Android信息写入手机之经纬度信息持续写入手机新的知识及脑图代码思路过程功能及介绍(必看)运行演示
Android信息写入手机之经纬度信息持续写入手机新的知识及脑图代码思路过程功能及介绍(必看)运行演示
Android信息写入手机之经纬度信息持续写入手机新的知识及脑图代码思路过程功能及介绍(必看)运行演示
Android信息写入手机之经纬度信息持续写入手机新的知识及脑图代码思路过程功能及介绍(必看)运行演示
Android信息写入手机之经纬度信息持续写入手机新的知识及脑图代码思路过程功能及介绍(必看)运行演示