I figured out how to do it the hard way as given above. I settled for a square area for the LatLngBounds to simplify getting the bearing number (which is okay with me as long as it fits in the screen: you can figure out what the bearing would be from the center to the corners of non-square rectangles with some more trig). I also added a bit of padding, as the distance to between the points will be the same as the diagonal from the center to the northeast corner, and that will be greater than the distance from the center to the top edge which would mean the second point could be above the top edge and not visible (if it were, say, due north). I borrowed heavily from http://www.movable-type.co.uk/scripts/latlong.html and calculating Lat and Long from Bearing and Distance,
Here's my method for getting the LatLngBounds:
public LatLngBounds getBounds(double lat1, double lng1, double lat2,
double lng2) {
// defines a square area with point lat1,lng1 at center and includes
// point
// lat2, long2 with a buffer between edge and second point
// get distance between two points
float[] results = new float[1];
Location.distanceBetween(lat1, lng1, lat2, lng2, results);
double d = results[0];
d = (d * 1.5); // add padding. The shortest distance to an edge of the
//square box is d * cos(45 degrees). Thus it's possible that the second point will be out of the box. To compensate I make the radius larger (d * 1/cos(45) = d * 1.41). I put a bit extra so that the second point isn't right on the edge of the screen.
long R = 6371000; // distance of earth's radius in meters
d = d /(double) R;
lat1 = Math.toRadians(lat1); // Current lat point converted to radians
lng1 = Math.toRadians(lng1); // Current long point converted to radians
// calculate northeast corner of LatLngBounds
double brng = Math.toRadians(45); // bearing from center to northeast in
// radians
double resultLat1 = Math.asin(Math.sin(lat1) * Math.cos(d)
+ Math.cos(lat1) * Math.sin(d) * Math.cos(brng));
double resultLng1 = lng1
+ Math.atan2(Math.sin(brng) * Math.sin(d) * Math.cos(lat1),
Math.cos(d) - Math.sin(lat1) * Math.sin(resultLat1));
resultLat1 = Math.toDegrees(resultLat1);
resultLng1 = Math.toDegrees(resultLng1);
Log.i("My Code", "resultLat1: " + resultLat1 + " resultLng1: " + resultLng1);
LatLng northEast = new LatLng(resultLat1, resultLng1);
// calculate southwest corner of LatLngBounds. Everything is the same
// except the bearing value
brng = Math.toRadians(225); // bearing from center to southwest corner
// in radians
double resultLat2 = Math.asin(Math.sin(lat1) * Math.cos(d)
+ Math.cos(lat1) * Math.sin(d) * Math.cos(brng));
double resultLng2 = lng1
+ Math.atan2(Math.sin(brng) * Math.sin(d) * Math.cos(lat1),
Math.cos(d) - Math.sin(lat1) * Math.sin(resultLat2));
resultLat2 = Math.toDegrees(resultLat2);
resultLng2 = Math.toDegrees(resultLng2);
Log.i("My Code", "resultLat2: " + resultLat2 + " resultLng2: " + resultLng2);
LatLng southWest = new LatLng(resultLat2, resultLng2);
LatLngBounds bounds = new LatLngBounds(southWest, northEast);
return bounds;
}