Flickrj-android getRequestToken()抛出IOException

时间:2017-02-17 16:55:03

标签: java android flickr flickrj

我正在为我的学校项目开发一个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();}

0 个答案:

没有答案