Java Flickrj android getRequestToken()引发IOException

Java Flickrj android getRequestToken()引发IOException,java,android,flickr,flickrj,Java,Android,Flickr,Flickrj,我正在为我的学校项目开发一个android应用程序。它涉及flickr网站提供的flickr android api的实现: 我在androidstudio上创建了一个基本项目,只需在项目的libs目录中拖动.jar文件,并在AndroidManifest中添加了internet权限。API文档告诉我们首先创建Flickr对象,并在执行任何操作之前调用方法getRequestToken(): 这是我调用所有这些东西的代码,位于floatingActionButton

我正在为我的学校项目开发一个android应用程序。它涉及flickr网站提供的flickr android api的实现:

我在androidstudio上创建了一个基本项目,只需在项目的libs目录中拖动.jar文件,并在AndroidManifest中添加了internet权限。API文档告诉我们首先创建Flickr对象,并在执行任何操作之前调用方法getRequestToken()

这是我调用所有这些东西的代码,位于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();
            }
        }
MyApiKey和MyApiSecret由Flickr提供,用于开发应用程序

此代码生成此日志

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)
生成的url是正确的,当我将其粘贴到web浏览器中时,Flickr服务器会给出肯定的回答。坚持住,我们快完了!我打开API库中的REST.java文件,右键单击getInputStream(),然后转到函数声明:

    public InputStream getInputStream() throws IOException {
    throw new UnknownServiceException("protocol doesn't support input");
}
此文件位于以下文件夹中:

AppData\Local\Android\sdk\sources\Android-25\java\net\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\sun\net\www\protocol\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();}

我找到了一个解决办法,有点奇怪,但不管怎样。我注意到他们的github页面上有一些重要的内容:“请使用2.1.0+”但是这个API的最新版本是2.0.0。因此,我尝试克隆repo并将源文件复制到我的项目中。现在一切都很好(我觉得自己找不到答案,自己也找不到答案)。对不起,我浪费了你的时间!我找到了一个解决办法,有点奇怪,但不管怎样。我注意到他们的github页面上有一些重要的内容:“请使用2.1.0+”但是这个API的最新版本是2.0.0。因此,我尝试克隆repo并将源文件复制到我的项目中。现在一切都很好(我觉得自己找不到答案,自己也找不到答案)。对不起,我浪费了你的时间!