Glass 可以发送 HTTP 请求吗?
Can HTTP requests be sent from Glass?
我正在为 Google Glass 开发,在将文件从 Glass 上传到我用来管理 API 调用的 servlet 应用程序时遇到了问题。我使用开发者控制台设置了一个客户端 ID 和密码来验证来自 servlet 应用程序的 api 调用。我看到这些链接提到了来自 glass 的 http 请求:
...但他们并没有提供非常大的帮助。
我确实在清单文件中设置了 Internet 权限。这是我的代码:
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private static final String TAG = "MyAsyncTask";
private static String FILE_PATH;
private String fileType;
private static final String HOST_URL="http://10.0.2.2:8080/main";
private static java.io.File fileToUpload;
public MyAsyncTask(String filePath){
FILE_PATH=filePath;
fileToUpload=new java.io.File(FILE_PATH);
Log.d(TAG,FILE_PATH);
fileType=FILE_PATH.substring(FILE_PATH.indexOf("."));
}
@Override
protected Void doInBackground(Void... params) {
post();
return null;
}
private int post() {
int resultCode = 0;
String url = HOST_URL;
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("source", "glass"));
try {
post.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(post);
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + post.getEntity());
System.out.println("Response Code : " +
response.getStatusLine().getStatusCode());
resultCode = response.getStatusLine().getStatusCode();
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
} catch (Exception e) {
Log.e("POST", e.getMessage());
}
return resultCode;
}
调用MyAsyncTask(filePath).execute()的结果;是连接被拒绝。我将 URL 设置为原来的样子,因为我读到本地主机可能指的是 Glass 设备,就像 Android 模拟器是 运行 时一样,但 servlet 是 运行宁在 http://localhost:8080。
作为参考,我使用 Jetty 6。1.x 作为我的 servlet。
我的问题可能是什么? Glass 不支持触发 HTTP 请求吗?我应该尝试在我没有的地方进行身份验证吗?如果需要,我很乐意提供任何其他参考信息。我非常感谢任何指导和专业知识。谢谢。
Glass 支持 HTTP 调用 - 我不认为这是你的问题。
问题似乎更可能出在您的 servlet 或网络配置(或它们的某种组合)上。
一些要检查的东西:
- 确保您的 Glass 已连接到您的本地网络,并且与您的服务器连接到同一本地网络。服务器的 10.x.x.x 地址表明它在专用网络上,您需要确保 Glass 在同一个专用网络上。
- 您可以在 Glass 的设置屏幕上检查并确认它连接的是哪个 wifi 网络。确保它显示 "Wi-Fi"。点击屏幕,它应该会告诉您连接到哪个 wifi 网络。
- 为了验证,您可能需要获取设备的 IP 地址。请参阅 this answer 以获取一些可能有助于您这样做的代码。
- 确保您可以通过您提供的地址访问服务器。如果可以,请在另一台机器(同一网络)上使用浏览器。确保您使用的 URL Glass 应用程序将使用的确切信息 - http://10.0.2.2:8080/main
- 使用 IP 地址比 "localhost" 更重要。
- 从同一台机器与同一网络上的另一台机器进行测试可能表明机器上的防火墙阻塞了端口。
- 确认您的 servlet 正在监听哪个端口。
- 您没有谈论您使用的是什么 servlet 引擎,因此很难准确指出您应该检查哪个文件的配置。如果您告诉我们,如果您不知道,我们也许可以为您指明正确的方向。
- Glass 上的 URL 正在查找 8080,因此请确保您的 servlet 也设置为使用该端口。 (8080 是一个非常典型的端口,但不能保证。)您的 servlet 不应自行打开端口 - 让 servlet 容器处理它。
- 检查您的 servlet 日志,尤其是访问日志,看看 Glass 设备和上面的手动测试是否确实连接到它。或者如果有任何东西可以连接到它。
我解决了我的问题,我意识到我可以提供更多信息。我很抱歉。无论如何,Jetty 服务器仅在本地主机 (127.0.0.1) 上 运行ning。为了解决这个问题,我编辑了我的 Maven 项目的 pom.xml 文件,如下所示:
-在配置标签下的 appengine 插件标签中添加了地址为 0.0.0.0 的地址标签和端口为 8080 的端口标签。这允许它在本地主机上 运行。
- 然后当我尝试访问原始本地 ip 时,appengine 给出了 400 错误,所以我在我的机器上编辑了位于 /private/etc/hosts 之类的主机文件并添加了这一行:
my-wlan-ip fakedomain.com
但我还必须将 fakedomain.com:8080/oauth2callback 添加到我在 Google 开发人员控制台凭据下注册的重定向 uris。
这让我可以从其他设备访问我的开发服务器。
我正在为 Google Glass 开发,在将文件从 Glass 上传到我用来管理 API 调用的 servlet 应用程序时遇到了问题。我使用开发者控制台设置了一个客户端 ID 和密码来验证来自 servlet 应用程序的 api 调用。我看到这些链接提到了来自 glass 的 http 请求:
...但他们并没有提供非常大的帮助。
我确实在清单文件中设置了 Internet 权限。这是我的代码:
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private static final String TAG = "MyAsyncTask";
private static String FILE_PATH;
private String fileType;
private static final String HOST_URL="http://10.0.2.2:8080/main";
private static java.io.File fileToUpload;
public MyAsyncTask(String filePath){
FILE_PATH=filePath;
fileToUpload=new java.io.File(FILE_PATH);
Log.d(TAG,FILE_PATH);
fileType=FILE_PATH.substring(FILE_PATH.indexOf("."));
}
@Override
protected Void doInBackground(Void... params) {
post();
return null;
}
private int post() {
int resultCode = 0;
String url = HOST_URL;
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("source", "glass"));
try {
post.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(post);
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + post.getEntity());
System.out.println("Response Code : " +
response.getStatusLine().getStatusCode());
resultCode = response.getStatusLine().getStatusCode();
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
} catch (Exception e) {
Log.e("POST", e.getMessage());
}
return resultCode;
}
调用MyAsyncTask(filePath).execute()的结果;是连接被拒绝。我将 URL 设置为原来的样子,因为我读到本地主机可能指的是 Glass 设备,就像 Android 模拟器是 运行 时一样,但 servlet 是 运行宁在 http://localhost:8080。
作为参考,我使用 Jetty 6。1.x 作为我的 servlet。
我的问题可能是什么? Glass 不支持触发 HTTP 请求吗?我应该尝试在我没有的地方进行身份验证吗?如果需要,我很乐意提供任何其他参考信息。我非常感谢任何指导和专业知识。谢谢。
Glass 支持 HTTP 调用 - 我不认为这是你的问题。
问题似乎更可能出在您的 servlet 或网络配置(或它们的某种组合)上。
一些要检查的东西:
- 确保您的 Glass 已连接到您的本地网络,并且与您的服务器连接到同一本地网络。服务器的 10.x.x.x 地址表明它在专用网络上,您需要确保 Glass 在同一个专用网络上。
- 您可以在 Glass 的设置屏幕上检查并确认它连接的是哪个 wifi 网络。确保它显示 "Wi-Fi"。点击屏幕,它应该会告诉您连接到哪个 wifi 网络。
- 为了验证,您可能需要获取设备的 IP 地址。请参阅 this answer 以获取一些可能有助于您这样做的代码。
- 确保您可以通过您提供的地址访问服务器。如果可以,请在另一台机器(同一网络)上使用浏览器。确保您使用的 URL Glass 应用程序将使用的确切信息 - http://10.0.2.2:8080/main
- 使用 IP 地址比 "localhost" 更重要。
- 从同一台机器与同一网络上的另一台机器进行测试可能表明机器上的防火墙阻塞了端口。
- 确认您的 servlet 正在监听哪个端口。
- 您没有谈论您使用的是什么 servlet 引擎,因此很难准确指出您应该检查哪个文件的配置。如果您告诉我们,如果您不知道,我们也许可以为您指明正确的方向。
- Glass 上的 URL 正在查找 8080,因此请确保您的 servlet 也设置为使用该端口。 (8080 是一个非常典型的端口,但不能保证。)您的 servlet 不应自行打开端口 - 让 servlet 容器处理它。
- 检查您的 servlet 日志,尤其是访问日志,看看 Glass 设备和上面的手动测试是否确实连接到它。或者如果有任何东西可以连接到它。
我解决了我的问题,我意识到我可以提供更多信息。我很抱歉。无论如何,Jetty 服务器仅在本地主机 (127.0.0.1) 上 运行ning。为了解决这个问题,我编辑了我的 Maven 项目的 pom.xml 文件,如下所示:
-在配置标签下的 appengine 插件标签中添加了地址为 0.0.0.0 的地址标签和端口为 8080 的端口标签。这允许它在本地主机上 运行。
- 然后当我尝试访问原始本地 ip 时,appengine 给出了 400 错误,所以我在我的机器上编辑了位于 /private/etc/hosts 之类的主机文件并添加了这一行:
my-wlan-ip fakedomain.com
但我还必须将 fakedomain.com:8080/oauth2callback 添加到我在 Google 开发人员控制台凭据下注册的重定向 uris。
这让我可以从其他设备访问我的开发服务器。