0

I am trying to get the users albums using the FB SDK. I have managed to log-in successfully and am able to retrieve the users profile picture and acquire an access token.

I am following this answer here and am trying to get it to work, but I am running into an issue where I get java.lang.NullPointerException in the adapter class on at com.myapp.myapp.PhotosAdapter.getCount(PhotosAdapter.java:37)

Here's the full set-up as to what I have:

Where am I going wrong? thanks

FBGRID activity:

public class FBGRID extends Activity {

private String URL;

// STORE THE PAGING URL
private String pagingURL;

// FLAG FOR CURRENT PAGE
int current_page = 1;

// BOOLEAN TO CHECK IF NEW FEEDS ARE LOADING
Boolean loadingMore = true;

Boolean stopLoadingData = false;

GridView grid;

ArrayList<getPhotos> arrPhotos;

PhotosAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fbgrid);

    grid = (GridView) findViewById(R.id.gridView1);

    grid.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            int lastInScreen = firstVisibleItem + visibleItemCount;
            if ((lastInScreen == totalItemCount) && !(loadingMore)) {

                if (stopLoadingData == false) {
                    // FETCH THE NEXT BATCH OF FEEDS
                    new loadMorePhotos().execute();
                }

            }
        }
    });

    new getPhotosData().execute();

}

private class getPhotosData extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {

        // CHANGE THE LOADING MORE STATUS TO PREVENT DUPLICATE CALLS FOR
        // MORE DATA WHILE LOADING A BATCH
        loadingMore = true;

        Session s = Session.getActiveSession();

        // SET THE INITIAL URL TO GET THE FIRST LOT OF ALBUMS
        URL = "https://graph.facebook.com/" + "me/albums"
                + "/photos&access_token=" + s.getAccessToken()
                + "?limit=10";

        try {

            HttpClient hc = new DefaultHttpClient();
            HttpGet get = new HttpGet(URL);
            HttpResponse rp = hc.execute(get);

            if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                String queryAlbums = EntityUtils.toString(rp.getEntity());

                JSONObject JOTemp = new JSONObject(queryAlbums);

                JSONArray JAPhotos = JOTemp.getJSONArray("data");

                // IN MY CODE, I GET THE NEXT PAGE LINK HERE

                getPhotos photos;

                for (int i = 0; i < JAPhotos.length(); i++) {
                    JSONObject JOPhotos = JAPhotos.getJSONObject(i);
                    // Log.e("INDIVIDUAL ALBUMS", JOPhotos.toString());

                    if (JOPhotos.has("link")) {

                        photos = new getPhotos();

                        // GET THE ALBUM ID
                        if (JOPhotos.has("id")) {
                            photos.setPhotoID(JOPhotos.getString("id"));
                        } else {
                            photos.setPhotoID(null);
                        }

                        // GET THE ALBUM NAME
                        if (JOPhotos.has("name")) {
                            photos.setPhotoName(JOPhotos.getString("name"));
                        } else {
                            photos.setPhotoName(null);
                        }

                        // GET THE ALBUM COVER PHOTO
                        if (JOPhotos.has("picture")) {
                            photos.setPhotoPicture(JOPhotos
                                    .getString("picture"));
                        } else {
                            photos.setPhotoPicture(null);
                        }

                        // GET THE PHOTO'S SOURCE
                        if (JOPhotos.has("source")) {
                            photos.setPhotoSource(JOPhotos
                                    .getString("source"));
                        } else {
                            photos.setPhotoSource(null);
                        }

                        arrPhotos.add(photos);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        grid.setAdapter(new PhotosAdapter(FBGRID.this, arrPhotos));

        loadingMore = false;
    }

}

private class loadMorePhotos extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {

        // SET LOADING MORE "TRUE"
        loadingMore = true;

        // INCREMENT CURRENT PAGE
        current_page += 1;

        // Next page request
        URL = pagingURL;

        try {

            HttpClient hc = new DefaultHttpClient();
            HttpGet get = new HttpGet(URL);
            HttpResponse rp = hc.execute(get);

            if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                String queryAlbums = EntityUtils.toString(rp.getEntity());
                // Log.e("PAGED RESULT", queryAlbums);

                JSONObject JOTemp = new JSONObject(queryAlbums);

                JSONArray JAPhotos = JOTemp.getJSONArray("data");

                // IN MY CODE, I GET THE NEXT PAGE LINK HERE

                getPhotos photos;

                for (int i = 0; i < JAPhotos.length(); i++) {
                    JSONObject JOPhotos = JAPhotos.getJSONObject(i);
                    // Log.e("INDIVIDUAL ALBUMS", JOPhotos.toString());

                    if (JOPhotos.has("link")) {

                        photos = new getPhotos();

                        // GET THE ALBUM ID
                        if (JOPhotos.has("id")) {
                            photos.setPhotoID(JOPhotos.getString("id"));
                        } else {
                            photos.setPhotoID(null);
                        }

                        // GET THE ALBUM NAME
                        if (JOPhotos.has("name")) {
                            photos.setPhotoName(JOPhotos.getString("name"));
                        } else {
                            photos.setPhotoName(null);
                        }

                        // GET THE ALBUM COVER PHOTO
                        if (JOPhotos.has("picture")) {
                            photos.setPhotoPicture(JOPhotos
                                    .getString("picture"));
                        } else {
                            photos.setPhotoPicture(null);
                        }

                        // GET THE ALBUM'S PHOTO COUNT
                        if (JOPhotos.has("source")) {
                            photos.setPhotoSource(JOPhotos
                                    .getString("source"));
                        } else {
                            photos.setPhotoSource(null);
                        }

                        arrPhotos.add(photos);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        // get listview current position - used to maintain scroll position
        int currentPosition = grid.getFirstVisiblePosition();

        // APPEND NEW DATA TO THE ARRAYLIST AND SET THE ADAPTER TO THE
        // LISTVIEW
        adapter = new PhotosAdapter(FBGRID.this, arrPhotos);
        grid.setAdapter(adapter);

        // Setting new scroll position
        grid.setSelection(currentPosition + 1);

        // SET LOADINGMORE "FALSE" AFTER ADDING NEW FEEDS TO THE EXISTING
        // LIST
        loadingMore = false;
    }

}

public class getPhotos {

    String PhotoID;

    String PhotoName;

    String PhotoPicture;

    String PhotoSource;

    // SET THE PHOTO ID
    public void setPhotoID(String PhotoID) {
        this.PhotoID = PhotoID;
    }

    // GET THE PHOTO ID
    public String getPhotoID() {
        return PhotoID;
    }

    // SET THE PHOTO NAME
    public void setPhotoName(String PhotoName) {
        this.PhotoName = PhotoName;
    }

    // GET THE PHOTO NAME
    public String getPhotoName() {
        return PhotoName;
    }

    // SET THE PHOTO PICTURE
    public void setPhotoPicture(String PhotoPicture) {
        this.PhotoPicture = PhotoPicture;
    }

    // GET THE PHOTO PICTURE
    public String getPhotoPicture() {
        return PhotoPicture;
    }

    // SET THE PHOTO SOURCE
    public void setPhotoSource(String PhotoSource) {
        this.PhotoSource = PhotoSource;
    }

    // GET THE PHOTO SOURCE
    public String getPhotoSource() {
        return PhotoSource;
    }
}

}

and for the Adapter class(it uses an image loading library):

final class PhotosAdapter extends BaseAdapter {

private Activity activity;

ArrayList<getPhotos> arrayPhotos;

private static LayoutInflater inflater = null;
ImageLoader imageLoader;

public PhotosAdapter(Activity a, ArrayList<getPhotos> arrPhotos) {

    activity = a;

    arrayPhotos = arrPhotos;

    inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader = new ImageLoader(activity.getApplicationContext());
}

public int getCount() {
    return arrayPhotos.size();
}

public Object getItem(int position) {
    return arrayPhotos.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

    View vi = convertView;
    if (convertView == null) {
        vi = inflater.inflate(R.layout.photos_item, null);

        holder = new ViewHolder();

        holder.imgPhoto = (ImageView) vi.findViewById(R.id.grid_item_image);

        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }

    if (arrayPhotos.get(position).getPhotoPicture() != null) {
        imageLoader.DisplayImage(arrayPhotos.get(position)
                .getPhotoPicture(), holder.imgPhoto);
    }
    return vi;
}

static class ViewHolder {
    ImageView imgPhoto;

}
}

Here's logcat:

    FATAL EXCEPTION: main
java.lang.NullPointerException
at com.myapp.myapp.PhotosAdapter.getCount(PhotosAdapter.java:37)
at android.widget.GridView.setAdapter(GridView.java:186)
at com.myapp.myapp.FBGRID$getPhotosData.onPostExecute(FBGRID.java:173)
at com.myapp.myapp.FBGRID$getPhotosData.onPostExecute(FBGRID.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:5225)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
Community
  • 1
  • 1
Jack
  • 2,043
  • 7
  • 40
  • 69
  • Are you sure you're actually parsing anything from the result? You don't seem to be initializing the arrPhotos object anywhere, so it's quite possible that when you're calling new PhotosAdapter(FBGRID.this, arrPhotos) in onPostExecute, arrPhotos is actually null. – Ming Li Dec 17 '14 at 19:35
  • Hey Jack. Sorry I could not see your post earlier. @MingLi is correct. Your `arrPhotos` has not been initialized. Add `arrPhotos = new ArrayList();` in your `onCreate()` right before calling `new getPhotosData().execute();` That should fix it for ya. Let me know how it goes. :-) – Siddharth Lele Dec 18 '14 at 06:36
  • Thank you very much, it works now! have a great Christmas guys! :) – Jack Dec 18 '14 at 10:28

0 Answers0