我正在为我的学校项目开发一个Android应用程序。它涉及Flickr网站提供的flickr-android api的实现:
https://code.google.com/archive/p/flickrj-android/
我在Android Studio上创建了一个基本项目,只需拖动项目的libs目录中的.jar文件,并在AndroidManifest中添加了Internet权限。 API文档告诉我们首先创建一个Flickr对象,并在执行任何操作之前调用方法 getRequestToken():
https://code.google.com/archive/p/flickrj-android/wikis/HowToGuide4Android.wiki
这是我调用所有这些东西的代码,位于 floatingActionButton
public void onClick(View view) {
Flickr flickr = new Flickr("MyApiKey", "MyApiSecret");
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
OAuthToken oAuthToken = flickr.getOAuthInterface().getRequestToken(null);
Snackbar.make(view, "Token is: " + oAuthToken.getOauthToken(), Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
} catch (IOException | FlickrException e) {
e.printStackTrace();
}
}
Flickr为开发您的应用程序提供了MyApiKey 和 MyApiSecret 。
此代码生成此日志
W/System.err: java.io.FileNotFoundException: http://www.flickr.com/services/oauth/request_token?oauth_callback=oob&oauth_consumer_key=MyApiKey&oauth_nonce=8232670419290&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1487346151&oauth_version=1.0&oauth_signature=BQDMBeY8jpWka77falMAcjBGKAQ%3D
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:250)
W/System.err: at com.gmail.yuyang226.flickr.REST.getInputStream(REST.java:154)
W/System.err: at com.gmail.yuyang226.flickr.REST.getLine(REST.java:169)
W/System.err: at com.gmail.yuyang226.flickr.REST.getMapData(REST.java:195)
W/System.err: at com.gmail.yuyang226.flickr.oauth.OAuthInterface.getRequestToken(OAuthInterface.java:121)
->W/System.err: at com.example.louis.flickrtest.MainActivity$1.onClick(MainActivity.java:41) //This is where I call getRequestToken()
W/System.err: at android.view.View.performClick(View.java:5637)
W/System.err: at android.view.View$PerformClick.run(View.java:22429)
W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:154)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6119)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
生成的网址是正确的,当我将其粘贴到我的网络浏览器中时,Flickr服务器给我一个肯定的答案。在那里我们差不多完成了!我打开了API库中的REST.java文件,右键单击 getInputStream()并转到函数声明:
public InputStream getInputStream() throws IOException {
throw new UnknownServiceException("protocol doesn't support input");
}
此文件位于以下文件夹中:
应用程序数据\本地\的Android \ SDK \源\机器人-25 \ java的\净\ URLConnection.java
这个功能很烦人,因为它阻止我使用API。但是,我设法找到了更多。我再次右键单击该功能,并要求转到实施。它给了我多个结果,包括前面提到的文件加上另一个看起来更好的文件:
public synchronized InputStream getInputStream() throws IOException {
this.connecting = true;
SocketPermission var1 = this.URLtoSocketPermission(this.url);
if(var1 != null) {
try {
return (InputStream)AccessController.doPrivilegedWithCombiner(new PrivilegedExceptionAction() {
public InputStream run() throws IOException {
return HttpURLConnection.this.getInputStream0();
}
}, (AccessControlContext)null, new Permission[]{var1});
} catch (PrivilegedActionException var3) {
throw (IOException)var3.getException();
}
} else {
return this.getInputStream0();
}
}
此文件位于此处:
AndroidStudio \ JRE \ JRE \ lib中\ rt.jar中!\太阳\净\ WWW \协议\ HTTP \ HttpURLConnection.class
我认为这是被调用的正确函数,但我不知道我该怎么做。顺便说一下,为了确保没有这个功能,我称之为在第一行放置一个断点并再次调试它。 Android Studio没有在任何突破点停止。
提前感谢您,如果您需要有关我的问题的更多信息,请不要犹豫。
编辑:我读得太快,意识到我正在寻找错误的文件/功能。日志显示文件的名称 HttpURLConnectionImpl 。我在这个文件中查找了该函数并找到了它,但由于缺少此API的文档,我不明白该怎么做: @Override public final InputStream getInputStream() throws IOException {
if (!doInput) {
throw new ProtocolException("This protocol does not support input");
}
HttpEngine response = getResponse();
// if the requested file does not exist, throw an exception formerly the
// Error page from the server was returned if the requested file was
// text/html this has changed to return FileNotFoundException for all
// file types
if (getResponseCode() >= HTTP_BAD_REQUEST) {
throw new FileNotFoundException(url.toString()); // throws here
}
return response.getResponse().body().byteStream();}