80,351
社区成员
发帖
与我相关
我的任务
分享
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);
}
}
}
<?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>
网络权限已经获取了,请问还需要什么特殊设置?
private class PhotoAdapter extends RecyclerView.Adapter<PhotoHolder>{
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();
}
}
}