HttpClient将手机上的数据发送到服务器
到官网下载jar包,下载GA发布版本即可
在项目中将httpclient-4.5.5.jar、httpcore-4.4.9.jar、httpmime-4.5.5.jar、commons-logging-1.2.jar四个jar包放进lib中
服务器端
@Controller
@RequestMapping("/HttpInfoController")
public class GetHttpInfoController {
@RequestMapping("/getAndroid")
@ResponseBody
public String getAndroid(HttpServletRequest request, HttpServletResponse response) {
String data = request.getParameter("data");
try
{
String path="/root/Android.log";
File file=new File(path);
//若不存在即创建文件
if(!file.exists())
file.createNewFile(); //创建文件输入流
FileOutputStream out=new FileOutputStream(file,true); //如果追加方式用true StringBuffer sb=new StringBuffer();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sb.append("-----------"+sdf.format(new Date())+"------------\n");
sb.append(data+"\n");
//写入
out.write(sb.toString().getBytes("utf-8"));//注意需要转换对应的字符集
out.close();
}
catch(IOException ex)
{
System.out.println(ex.getStackTrace());
return "success";
}finally { }
return "success";
}
}
移动端
发送请求工具类
package com.autumn.tools; import android.icu.util.Output;
import android.util.Log; import com.autumn.pojo.GPSPojo; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils; public class HttpClientUtil {
public static void main(String[] args) throws IOException,
KeyManagementException, NoSuchAlgorithmException {
//post(URL,"Android项目HttpClient手动发送post()");
//postAndroid(URL,"Android项目HttpClient手动发送postAndroid()");
GPSPojo gpsPojo = new GPSPojo();
gpsPojo.setUserId("qyid1");
gpsPojo.setUserName("autumn");
postObjectAndroid(URL,gpsPojo);
}
//通用记录到日志url
public static String URL = "http://*****/getAndroid";
public static String URL_LOGIN = "http://***/forAndroid";
/**
* 正常环境中使用
* @param data
*/
public static void post(String url,String data) {
// 实例化httpclient
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建post实例
if(url==null||url.isEmpty()){
url = URL;
}
HttpPost httpPost = new HttpPost(URL);
httpPost.setHeader("Content-type", "application/x-www-form-urlencoded"); // 添加参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("data", data)); CloseableHttpResponse response = null;
// 将参数放入post实例
try {
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// httpclient执行操作返回response
response = httpclient.execute(httpPost);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 安卓使用放入data:json格式的对象
* @param data
*/
public static void postAndroid(final String url,final String data) {
Runnable runnable = new Runnable() {
public void run() { // 实例化httpclient
// CloseableHttpClient httpclient = HttpClients.createDefault(); 使用会与android核心包起冲突
org.apache.http.client.HttpClient httpclient = new DefaultHttpClient();
// 创建post实例
HttpPost httpPost = null;
if(url==null||url.isEmpty()){
httpPost = new HttpPost(URL);
}else{
httpPost = new HttpPost(url);
}
httpPost.setHeader("Content-type",
"application/x-www-form-urlencoded"); // 添加参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("data", data)); // CloseableHttpResponse response = null; 使用会与android核心包起冲突
HttpResponse response = null;
// 将参数放入post实例
try {
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
response = httpclient.execute(httpPost);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
new Thread(runnable).start();
} /**
* 安卓使用放Http发送Object对象中的每一个字段作为参数,值作为参数值
* @param data
*/
public static void postObjectAndroid(final String url,final Object data) {
Runnable runnable = new Runnable() {
public void run() { // 实例化httpclient
// CloseableHttpClient httpclient = HttpClients.createDefault(); 使用会与android核心包起冲突
org.apache.http.client.HttpClient httpclient = new DefaultHttpClient();
// 创建post实例
HttpPost httpPost = null;
if(url==null||url.isEmpty()){
httpPost = new HttpPost(URL);
}else{
httpPost = new HttpPost(url);
}
httpPost.setHeader("Content-type",
"application/x-www-form-urlencoded"); // 添加参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
Class dataClass = data.getClass();
Field[] declaredFields = dataClass.getDeclaredFields();
for (Field field:declaredFields){
try {
field.setAccessible(true);
if(field.get(data)!=null){ //字段值不为null,则作为参数
params.add(new BasicNameValuePair(field.getName(),field.get(data).toString()));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//params.add(new BasicNameValuePair("data", data)); // CloseableHttpResponse response = null; 使用会与android核心包起冲突
HttpResponse response = null;
// 将参数放入post实例
try {
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
response = httpclient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {//如果返回成功则解析
HttpEntity responseEntity = response.getEntity();
//方法一
InputStream inputStream = responseEntity.getContent();
StringBuilder stringBuilder = new StringBuilder();
byte[] temp = new byte[1024];
OutputStream outputStream = new ByteArrayOutputStream();
int len =0;
while((len=inputStream.read(temp))!=-1){
outputStream.write(temp,0,len);
String result = new String(temp);
stringBuilder.append(result);
}
Log.i("stringBuilder",stringBuilder.toString());
//方法二
/*String str = EntityUtils.toString(responseEntity, HTTP.UTF_8);
Log.i("str",str);*/ }
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
new Thread(runnable).start();
} }
消息通知监听ListenerService
package com.autumn.service; import android.app.Notification;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
import com.autumn.tools.HttpClientUtil; /**
* 消息监听
* @author Autumn
*/
public class NotificationMonitorService extends android.service.notification.NotificationListenerService {
// 在收到消息时触发
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
// TODO Auto-generated method stub
Bundle extras = sbn.getNotification().extras;
// 获取接收消息APP的包名
String notificationPkg = sbn.getPackageName();
// 获取接收消息的抬头
final String notificationTitle = extras.getString(Notification.EXTRA_TITLE);
// 获取接收消息的内容
String notificationText = extras.getString(Notification.EXTRA_TEXT);
if(notificationTitle==null&¬ificationText==null){ //如果为空,则不执行
return;
}
//发送数据
HttpClientUtil.postAndroid("autumn app: "+notificationPkg+" title: " + notificationTitle + " & " + notificationText);
//Log.e("listener_post", "autumn app post: "+notificationPkg+" title: " + notificationTitle + " & " + notificationText);
} // 在删除消息时触发
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
// TODO Auto-generated method stub
Bundle extras = sbn.getNotification().extras;
// 获取接收消息APP的包名
String notificationPkg = sbn.getPackageName();
// 获取接收消息的抬头
String notificationTitle = extras.getString(Notification.EXTRA_TITLE);
// 获取接收消息的内容
String notificationText = extras.getString(Notification.EXTRA_TEXT);
//Log.e("listener_remove", "autumn app post: "+notificationPkg+" title: " + notificationTitle + " & " + notificationText);
} }
要在AndroidManifest.xml注册service和权限
<!-- 访问网络,发送数据需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- application中注册消息监听service -->
<service android:name="com.autumn.service.NotificationMonitorService" <!--这里写service所在位置,默认包用.,不是默认包要写全路径,与activity同包可以只写类名-->
android:label="NotificationMonitor"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
启动监听服务分两种方式,一个是跳到授权界面并启动服务,第二个直接启动服务
Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent); //授权,跳到授权界面并启动服务 Intent startIntent = new Intent(this, BackService.class);
startService(startIntent); //启动服务
然后在MainActivity.java中添加运行service,onCreate()方法中代码
Intent intent_listener=new Intent(this, NotificationMonitorService.class);
intent_listener.setAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startService(intent_listener); //启动监听后台服务 setContentView(R.layout.activity_main); //获取启动服务按钮
Button btn_getAcc = (Button) findViewById(R.id.bt1);
//按钮点击事件
btn_getAcc.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String string = Settings.Secure.getString(getContentResolver(),
"enabled_notification_listeners");
if (!string.contains(NotificationMonitorService.class.getName())) {
Toast.makeText(MainActivity.this, "未获得权限,请选择允许权限", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "已经获得权限", Toast.LENGTH_SHORT).show();
} Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);// 来授权 会跳到授权界面
}
});
软件自启
软件开关机自启广播
package com.autumn.receiver; import com.autumn.service.NotificationMonitorService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent; /**
* 软件自启代码
* @author Autumn
*/
public class BroReceiver extends BroadcastReceiver {
public BroReceiver() {
} @Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
Intent intent1=new Intent(context, NotificationMonitorService.class);
intent1.setAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
context.startService(intent1); //启动监听服务
}
}
}
AndroidManifest.xml中注册
<!--开机权限-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <!-- 自启 -->
<receiver
android:name="com.autumn.receiver.BroReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
服务器查看接受数据 tail -f Android.log
注意事项:
1.httpclient出现和system/framework中的jar包起冲突情况
这是由于使用了CloseableHttpClient造成的,把
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse httpResponse = httpclient.execute(httpRequest);
替换成
HttpClient httpclient = new DefaultHttpClient();
HttpResponse httpResponse = httpclient.execute(httpRequest);
2.主线程中不可以存在http请求,要另起线程
Runnable runnable = new Runnable() {
public void run() {
HttpClient.postAndroid("Notification posted 通知标题: " + "通知内容:");
}
};
new Thread(runnable).start();
3.本人用的MIUI9系统,会出现每次点进去都要选择权限等一系列问题解决方案如下。
1.设置->更多设置->系统安全->通知使用权
2.软件设为自启动
HttpClient将手机上的数据发送到服务器的更多相关文章
- 使用Fiddler抓取手机上的数据包
在IIS中,如果网站已经绑定了域名在使用IP是不能访问的,需要添加一个空的主机名与IP的映射才能访问.如下图: Fiddler抓取手机包 在PC上建一个WIFI热的 勾选Fiddler中Tool-&g ...
- Android使用OpenGL ES2.0显示YUV,您的手机上的数据要解决两个方面的坐标
如果说 ,我不知道,如果你不明白这个话题.连接到:http://blog.csdn.net/wangchenggggdn/article/details/8896453(下称链接①), 里面评论有非常 ...
- VC++ Post 方法 上传数据到web服务器
最近在做一个项目,需要与WEB服务器交互一些信息.其中一项就是文件的上传与下载.现来一个上传的代码 #include "stdio.h" #include "WinSoc ...
- [PHP]利用XAMPP搭建本地服务器, 然后利用iOS客户端上传数据到本地服务器中(三. PHP端代码实现)
一.安装XAMPP http://www.cnblogs.com/lidongxu/p/5256330.html 二. 配置MySql http://www.cnblogs.com/lidongx ...
- 如何在 Android 手机上实现抓包?
如何在 Android 手机上实现抓包? http://www.zhihu.com/question/20467503 我想知道某个应用究竟在数据提交到哪里,提交了什么.网上的教程太复杂,不想麻烦.有 ...
- 史上最全最强Charles截取手机https协议数据包教程(附上利用此技术制作最近微信比较火的头脑王者辅助外挂)!
纯原创,思路也是本人花了半个小时整理出来的,整个完成花费了本人半天时间,由于不才刚大学毕业,所以有的编码方面可能不入大牛们的眼,敬请原谅!如有转载请附上本地址,谢谢! 最近微信朋友圈刚刚被跳一跳血洗, ...
- Android 本地tomcat服务器接收处理手机上传的数据之案例演示
上一篇:Android 本地tomcat服务器接收处理手机上传的数据之环境搭建 本篇基于上一篇搭建的服务器端环境,具体介绍Android真机上传数据到tomcat服务器的交互过程 场景:A ...
- UiPath工具取得网页上面的数据,写入到csv,Outlook邮件发送
问题描述: 想取得网页上面的股票价格,之后写入到csv文本里面之后添加附件发送邮件. 解决方法: 利用UIPath工具来取得数据,之后写入再发送. 具体步骤: 1.打开网页,之后找到所显示的股票行情的 ...
- 把采集到的数据发送到一个Google Docs或者Google Form上 这个网站提供了参考和例子
把采集到的数据发送到一个Google Docs或者Google Form上这个网站提供了参考和例子 http://www.instructables.com/id/Post-to-Google-Doc ...
随机推荐
- 限制ip ssh远程登录
有时候为了服务器的安全考虑,我们可以在服务器上做限制,禁止其他ip地址连接服务器. 方法一:修改ssh配置文件 其实做这个操作很简单,只需要改/etc/ssh/sshd_config配置文件,再最后一 ...
- Andrew Ng机器学习公开课笔记 -- Generative Learning algorithms
网易公开课,第5课 notes,http://cs229.stanford.edu/notes/cs229-notes2.pdf 学习算法有两种,一种是前面一直看到的,直接对p(y|x; θ)进行建模 ...
- Linux squid 缓存服务器
一.简介 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自动处理所下载的数据.当一个用 ...
- SHFileOperation的用法
//删除文件或者文件夹bool DeleteFile(char * lpszPath){SHFILEOPSTRUCT FileOp={0};FileOp.fFlags = FOF_ALLOWUNDO ...
- Spark中RDD转换成DataFrame的两种方式(分别用Java和Scala实现)
一:准备数据源 在项目下新建一个student.txt文件,里面的内容为: ,zhangsan, ,lisi, ,wanger, ,fangliu, 二:实现 Java版: 1.首先新建一个s ...
- 【转】Deep Learning(深度学习)学习笔记整理系列之(一)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-0 ...
- 接口测试之接口api文档的重要性
接口文档的特点 接口文档,顾名思义就是对接口说明的文档.好的接口文档包含了对接口URL,参数以及输出内容的说明,我们参照接口文档就能编写出一个个的测试用例.而且接口文档详细的话,测试用例编写简单,不会 ...
- Django的FBV和CB
Django的FBV和CBV FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV C ...
- NULL头文件
#include<stddef.h> NULL不是C语言基本类型,其定义在stddef.h文件中,作为最基本的语言依赖宏存在.但是随着C/C++的发展,很多文件只要涉及了系统或者标准操作都 ...
- 系统管理命令之logname
logname命令,可以显示自己初次登录到系统中的用户名,主要识别sudo前后情形,与whoami相反. 1.查看该命令的帮助信息. # logname --help 2.查看该命令的版本信息. # ...