微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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);

Intent intent = new Intent(MainActivity.this,NewFileActivity.class);
startActivity(intent);
EditText editText = (EditText)findViewById(R.id.input_fileName);//获取EditText对象
fileName = editText.getText().toString();//获取EditText中内容
  • 百度地图的Activity中调用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当中
    具体的语句功能介绍,见脑图

运行演示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐