无法从网站获取图片数据

flyingdream123 2018-01-10 10:14:30
最近在看《Android编程权威指南》看到第25章时被卡住了,从网站获取图片,当程序执行到:connection.getInputStream();时,就不再往下执行了,也没看到报什么错误,在浏览器上请求网页是能正常返回结果,但在代码中就不行,刚学Android,请指点,谢谢!

package com.bignerdranch.android.phonegallery;

import android.net.Uri;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.HttpsURLConnection;

/**
* Created by yyy on 2017/12/10.
*/

public class FlickrFetchr {
private static final String TAG="FlickrFetchr";
private static final String API_KEY="4b096054791f66ac2b6889b348019229";
// private static final String API_KEY="d47609e8e050c73e93b1aeff13ca51cd";
// private static final String Secret="14cd1ff5e130a568";

public byte[] getUrlBytes(String urlSpec) throws IOException{
URL url=new URL(urlSpec);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();

try{
ByteArrayOutputStream out=new ByteArrayOutputStream();
Log.i(TAG,"开始执行: getInputStream()...");
InputStream in=null;
try {
in = connection.getInputStream();
Log.i(TAG, "getInputStream 已经调用.");
}catch (IOException ex)
{
Log.i(TAG,ex.getMessage());
}

Log.i(TAG,"End getInputStream().");

if(connection.getResponseCode()!=HttpURLConnection.HTTP_OK){
throw new IOException(connection.getResponseMessage()+": with "+urlSpec);
}

int bytesRead=0;
byte[] buffer=new byte[1024];
while ((bytesRead=in.read(buffer))>0){
out.write(buffer,0,bytesRead);
}
out.close();
return out.toByteArray();
}finally {
connection.disconnect();
}
}

public String getUrlString(String urlSpec)throws IOException{
return new String(getUrlBytes(urlSpec));
}

public List<GalleryItem> fetchItems(){
List<GalleryItem> items=new ArrayList<>();
try{

String url = Uri.parse("https://api.flickr.com/services/rest/")
.buildUpon()
.appendQueryParameter("method", "flickr.photos.getRecent")
.appendQueryParameter("api_key", API_KEY)
.appendQueryParameter("format", "json")
.appendQueryParameter("nojsoncallback", "1")
.appendQueryParameter("extras", "url_s")
.appendQueryParameter("per_page","3")
.build().toString();

Log.i(TAG,"url:"+url);
String jsonString=getUrlString(url);
Log.i(TAG,"Received JSON: "+jsonString);
JSONObject jsonBody=new JSONObject(jsonString);
parseItems(items,jsonBody);
}catch (IOException ioe){
Log.e(TAG,"Failed to fetch items",ioe);
}catch (JSONException je){
Log.e(TAG,"Failed to parse JSON",je);
}
return items;
}

private void parseItems(List<GalleryItem> items,JSONObject jsonBody) throws IOException,JSONException{
JSONObject photosJsonObject=jsonBody.getJSONObject("photos");
JSONArray photoJsonArray=photosJsonObject.getJSONArray("photo");

for (int i=0;i<photoJsonArray.length();i++){
JSONObject photoJsonObject=photoJsonArray.getJSONObject(i);

GalleryItem item=new GalleryItem();
item.setId(photoJsonObject.getString("id"));
item.setCaption(photoJsonObject.getString("title"));

if(!photoJsonObject.has("url_s")){
continue;
}

item.setUrl(photoJsonObject.getString("url_s"));
items.add(item);
}
}



}



日志:
01-10 14:13:19.188 4036-4036/? I/art: Not late-enabling -Xcheck:jni (already on)
01-10 14:13:19.189 4036-4036/? W/art: Unexpected CPU variant for X86 using defaults: x86_64
01-10 14:13:19.626 4036-4036/com.bignerdranch.android.phonegallery W/System: ClassLoader referenced unknown path: /data/app/com.bignerdranch.android.phonegallery-2/lib/x86_64
01-10 14:13:19.984 4036-4036/com.bignerdranch.android.phonegallery I/InstantRun: starting instant run server: is main process
01-10 14:13:20.269 4036-4036/com.bignerdranch.android.phonegallery W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
01-10 14:13:20.679 4036-4052/com.bignerdranch.android.phonegallery I/FlickrFetchr: url:https://api.flickr.com/services/rest/?method=flickr.photos.getRecent&api_key=4b096054791f66ac2b6889b348019229&format=json&nojsoncallback=1&extras=url_s&per_page=3
01-10 14:13:20.717 4036-4052/com.bignerdranch.android.phonegallery D/NetworkSecurityConfig: No Network Security Config specified, using platform default
01-10 14:13:20.727 4036-4052/com.bignerdranch.android.phonegallery I/FlickrFetchr: 开始执行: getInputStream()...
01-10 14:13:20.996 4036-4056/com.bignerdranch.android.phonegallery I/OpenGLRenderer: Initialized EGL, version 1.4
01-10 14:13:20.997 4036-4056/com.bignerdranch.android.phonegallery D/OpenGLRenderer: Swap behavior 1
01-10 14:13:21.003 4036-4056/com.bignerdranch.android.phonegallery W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
01-10 14:13:21.004 4036-4056/com.bignerdranch.android.phonegallery D/OpenGLRenderer: Swap behavior 0
01-10 14:13:21.077 4036-4056/com.bignerdranch.android.phonegallery D/EGL_emulation: eglCreateContext: 0x73f094435aa0: maj 2 min 0 rcv 2
01-10 14:13:21.134 4036-4056/com.bignerdranch.android.phonegallery D/EGL_emulation: eglMakeCurrent: 0x73f094435aa0: ver 2 0 (tinfo 0x73f09440c560)
01-10 14:13:21.163 4036-4036/com.bignerdranch.android.phonegallery W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
01-10 14:13:21.172 4036-4056/com.bignerdranch.android.phonegallery D/EGL_emulation: eglMakeCurrent: 0x73f094435aa0: ver 2 0 (tinfo 0x73f09440c560)
...全文
1223 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhugegangtie 2018-01-19
  • 打赏
  • 举报
回复
你确定这个网站的SSL证书是从权威机构申请的吗,试试重写TrustManager,信任所有网站,看看可不可以请求成功。
flyingdream123 2018-01-19
  • 打赏
  • 举报
回复
国内有没有这种共享图片的网站?有专门提供API调用的
flyingdream123 2018-01-17
  • 打赏
  • 举报
回复
AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bignerdranch.android.phonegallery">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".PhotoGalleryActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
网络权限已经获取了,请问还需要什么特殊设置?
assky124 2018-01-17
  • 打赏
  • 举报
回复
HTTPS 要特殊设置
qq_41123399 2018-01-16
  • 打赏
  • 举报
回复
渣渣飘过
flyingdream123 2018-01-16
  • 打赏
  • 举报
回复
在网上查了,找不到解决方案才来问的。 随便换成csdn.net网址又能正常获取到数据,但是下面这个网址在浏览器中能正常获取到数据,为什么在代码里就没办法获取数据呢? https://api.flickr.com/services/rest/?method=flickr.photos.getRecent&api_key=d47609e8e050c73e93b1aeff13ca51cd&format=json&nojsoncallback=1&extras=url_s
Jing丶無雙 2018-01-12
  • 打赏
  • 举报
回复
你这里报错提示java.net.ConnectException: Connection refused,这里看看http://blog.csdn.net/weiruoao/article/details/26499145 另外你也应该自己网上查查
Jing丶無雙 2018-01-11
  • 打赏
  • 举报
回复
你这个connection.getInputStream()属于网络请求了,凡是网络请求都不能放在UI线程中,所以你应该开个子线程来调用你这封装的方法试试
flyingdream123 2018-01-11
  • 打赏
  • 举报
回复
过一段时间后,出现下面的错误信息 I/FlickrFetchr: End getInputStream(). E/FlickrFetchr: Failed to fetch items java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) at java.net.Socket.connect(Socket.java:586) at com.android.okhttp.internal.Platform.connectSocket(Platform.java:113) at com.android.okhttp.Connection.connectSocket(Connection.java:196) at com.android.okhttp.Connection.connect(Connection.java:172) at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367) at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java) at com.bignerdranch.android.phonegallery.FlickrFetchr.getUrlBytes(FlickrFetchr.java:39) at com.bignerdranch.android.phonegallery.FlickrFetchr.getUrlString(FlickrFetchr.java:65) at com.bignerdranch.android.phonegallery.FlickrFetchr.fetchItems(FlickrFetchr.java:83) at com.bignerdranch.android.phonegallery.PhotoGalleryFragment$FetchItemsTask.doInBackground(PhotoGalleryFragment.java:54) at com.bignerdranch.android.phonegallery.PhotoGalleryFragment$FetchItemsTask.doInBackground(PhotoGalleryFragment.java:51) at android.os.AsyncTask$2.call(AsyncTask.java:304) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761)
flyingdream123 2018-01-11
  • 打赏
  • 举报
回复
异步执行

 private class PhotoAdapter extends RecyclerView.Adapter<PhotoHolder>{
flyingdream123 2018-01-11
  • 打赏
  • 举报
回复
是导步执行的啊!

package com.bignerdranch.android.phonegallery;


import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * A simple {@link Fragment} subclass.
 */
public class PhotoGalleryFragment extends Fragment {
    private static final String TAG="PhotoGalleryFragment";
    private RecyclerView mPhotoRecyclerView;
    private List<GalleryItem> mItems=new ArrayList<>();

    public static PhotoGalleryFragment newInstance(){
        return new PhotoGalleryFragment();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        new FetchItemsTask().execute();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment_photo_gallery,container,false);

        mPhotoRecyclerView=(RecyclerView)v.findViewById(R.id.photo_recycler_view);
        mPhotoRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(),3));
        setupAdapter();
        return v;
    }

    private class FetchItemsTask extends AsyncTask<Void,Void,List<GalleryItem>> {
        @Override
        protected List<GalleryItem> doInBackground(Void... voids) {
            return new FlickrFetchr().fetchItems();
        }

        @Override
        protected void onPostExecute(List<GalleryItem> items) {
            mItems=items;
            setupAdapter();
        }
    }

    private void setupAdapter(){
        if (isAdded()){
            mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems));
        }
    }
    private class PhotoHolder extends RecyclerView.ViewHolder{
        private TextView mTitleTextView;

        public  PhotoHolder(View itemView){
            super(itemView);
            mTitleTextView=(TextView)itemView;
        }
        public void bindGalleryItem(GalleryItem item){
            mTitleTextView.setText(item.toString());
        }
    }

    private class PhotoAdapter extends RecyclerView.Adapter<PhotoHolder>{
        private List<GalleryItem> mGalleryItems;

        public  PhotoAdapter(List<GalleryItem> galleryItems){
            mGalleryItems=galleryItems;
        }

        @Override
        public PhotoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            TextView textView=new TextView(getActivity());
            return new PhotoHolder(textView);
        }

        @Override
        public void onBindViewHolder(PhotoHolder holder, int position) {
            GalleryItem galleryItem=mGalleryItems.get(position);
            holder.bindGalleryItem(galleryItem);
        }

        @Override
        public int getItemCount() {
            return mGalleryItems.size();
        }
    }



}

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧