java实现手机定位,java实时定位,定位功能,gps定位-适合定位小孩,老人,保护家人安全】
【手机定位软件-适合定位小孩,老人,保护家人安全】
下面说一下免费制作手机定位软件的实现方法,需要了解的朋友需要耐心的看完下面的内容,讲解通俗易懂,分几部讲解
第一步:拨打运营商电话,索要固定ip地址
1.运营商会告诉你ip资源紧缺,告诉他们,自己买的摄像头需要固定ip,如果他们还是不给,就告诉他们,不给就去工信部投诉,因为固定ip的钱,开宽带时已经出了的
2.有了固定ip,网上输入自己光猫的配置网站,我这边是电信,如下图,外部端口是互联网访问自己电脑或者手机的端口,内部端口是自己电脑或手机文件的端口
第二步:网上下载KSWEB,或者加我qq846988356分享给你
1.为主机配置本机文件的端口
2.手机文件管理器中 的htdocs文件夹 就是存放html,js,css,php等文件的地方
第三步:上百度地图定位,申请开发者账号
链接:百度地图定位
1.填写图中的内容
2.保存访问应用AK,后面会用到
3.下载定位开发包
链接:定位开发包
第四步:打开Android Studio
1.导入开发包(鼠标右键在这个位置,Add as Library),OK确定
发送端源码:
(LocationActivity.java)
这是只是改了个名字,刚创建android工程时,名字是MainActivity.java
package com.baidu.location.demo;
import com.baidu.send.R;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.service.LocationService;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONObject;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
public class LocationActivity extends Activity {
//先定义动态获取权限
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static final String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE" };
//然后通过一个函数来申请
public static void verifyStoragePermissions(Activity activity) {
try {
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.location);
verifyStoragePermissions(this);
}
@Override
protected void onStart() {
super.onStart();
LocationService locationService = ((LocationApplication) getApplication()).locationService;
locationService.registerListener(mListener);
//注册监听
int type = getIntent().getIntExtra("from", 0);
if (type == 0) {
locationService.setLocationOption(locationService.getDefaultLocationClientOption());
} else if (type == 1) {
locationService.start();
}
locationService.start();
}
private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
if (null != location && location.getLocType() != BDLocation.TypeServerError) {
String address=location.getAddrStr();
String path="你自己的公网ip+端口+xxx.php";
//比如:http://123.122.108.135:8011/send.php
new Thread(() -> postTask(address,path)).start();
}
}
};
private void postTask(String address,String path) {
try {
URL url=new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setConnectTimeout(5000);
conn.connect();
Map<String,String> data=new HashMap<String,String>();
@SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date=new Date(System.currentTimeMillis());
data.put("address",address);//这是提交地址
data.put("period",simpleDateFormat.format(date));//这里提交时间
JSONObject response=new JSONObject(data);
Log.i("提交的数据是:",response.toString());
OutputStream os=conn.getOutputStream();
DataOutputStream objout=new DataOutputStream(os);
objout.write(response.toString().getBytes());
objout.flush();
os.close();
objout.close();
int code=conn.getResponseCode();
if(code==200){
Log.i("请求码:", String.valueOf(code));
}else{
Log.i("连接错误:",String.valueOf(code));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
(LocationService.java)
package com.baidu.location.service;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import android.content.Context;
public class LocationService {
private static LocationClient client = null;
private static LocationClientOption mOption;
private static LocationClientOption DIYoption;
private Object objLock;
public LocationService(Context locationContext) {
objLock = new Object();
synchronized (objLock) {
if (client == null) {
client = new LocationClient(locationContext);
client.setLocOption(getDefaultLocationClientOption());
}
}
}
public boolean registerListener(BDAbstractLocationListener listener) {
boolean isSuccess = false;
if (listener != null) {
client.registerLocationListener(listener);
isSuccess = true;
}
return isSuccess;
}
public static boolean setLocationOption(LocationClientOption option) {
boolean isSuccess = false;
if (option != null) {
if (client.isStarted()) {
client.stop();
}
DIYoption = option;
client.setLocOption(option);
}
return isSuccess;
}
public LocationClientOption getDefaultLocationClientOption() {
if (mOption == null) {
mOption = new LocationClientOption();
mOption.setLocationMode(LocationMode.Hight_Accuracy); // 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
mOption.setCoorType( "bd09ll" ); // 可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
mOption.setScanSpan(5*60*1000); // 可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
mOption.setIsNeedAddress(true); // 可选,设置是否需要地址信息,默认不需要
mOption.setIsNeedLocationDescribe(true); // 可选,设置是否需要地址描述
mOption.setNeedDeviceDirect(false); // 可选,设置是否需要设备方向结果
mOption.setLocationNotify(false); // 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
mOption.setIgnoreKillProcess(true); // 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop
mOption.setIsNeedLocationDescribe(true); // 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
mOption.setIsNeedLocationPoiList(true); // 可选,默认false,设置是否需要POI结果,可以在BDLocation
mOption.SetIgnoreCacheException(false); // 可选,默认false,设置是否收集CRASH信息,默认收集
mOption.setOpenGps(true); // 可选,默认false,设置是否开启Gps定位
mOption.setIsNeedAltitude(false); // 可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
}
return mOption;
}
public void start() {
synchronized (objLock) {
if (client != null && !client.isStarted()) {
client.start();
}
}
}
}
(Location.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="wrap_content"
android:orientation="vertical">
</LinearLayout>
(AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.baidu.send">
<!-- 这个权限用于进行后台定位-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 允许挂载和反挂载文件系统可移动存储 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<!-- 允许程序读取底层系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<!-- 允许访问振动设备 -->
<uses-permission android:name="android.permission.VIBRATE"/>
<!-- 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失 -->
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- 允许程序读取或写入系统设置 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<!-- android 9.0上使用前台服务,需要添加权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 读取缓存数据 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 获取模拟定位信息 -->
<application
android:name="com.baidu.location.demo.LocationApplication"
android:allowBackup="true"
android:persistent="true"
android:usesCleartextTraffic="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black">
<!-- 声明service组件 -->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
<!-- AK鉴权 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="这是填写在百度申请的AK" />
<activity
android:name="com.baidu.location.demo.LocationActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,欢迎点赞,关注,收藏,下一篇接上(接收端源码)
原文作者:Atomic_space
原文地址: https://blog.csdn.net/qq_34526228/article/details/119150487
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qq_34526228/article/details/119150487
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章