Skip to content

Instantly share code, notes, and snippets.

@vvakame
Created September 1, 2010 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save vvakame/560746 to your computer and use it in GitHub Desktop.
Save vvakame/560746 to your computer and use it in GitHub Desktop.
import java.io.InputStream;
import roboguice.inject.InjectExtra;
import android.app.Activity;
import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.DisplayMetrics;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class BitmapFromUriExtraProvider implements Provider<Bitmap> {
@Inject
protected Activity act;
@InjectExtra("mediaImageUri")
protected Uri mediaUri;
@Override
public Bitmap get() {
ContentResolver resolver = act.getContentResolver();
Bitmap bitmap = null;
if (mediaUri != null) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
InputStream is = resolver.openInputStream(mediaUri);
BitmapFactory.decodeStream(is, null, options);
DisplayMetrics metrics = new DisplayMetrics();
act.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// 端末にあわせるため、幅が広い方を高さ、狭い方を幅とする。後の事は渡した先でやってくれ
final int width;
final int height;
if (options.outWidth < options.outHeight) {
width = options.outWidth;
height = options.outHeight;
} else {
width = options.outHeight;
height = options.outWidth;
}
if (metrics.widthPixels * 2 < width
|| metrics.heightPixels * 2 < height) {
// 端末解像度 〜 端末解像度 * 2 の範囲に収まるサイズにする
int scaleW = width / metrics.widthPixels;
int scaleH = height / metrics.heightPixels;
options.inSampleSize = Math.max(scaleW, scaleH);
}
is = resolver.openInputStream(mediaUri);
options.inJustDecodeBounds = false;
// NativeHeapから確保
// https://twitter.com/shoozhoo/statuses/22621375376
BitmapFactory.Options.class.getField("inNativeAlloc")
.setBoolean(options, true);
bitmap = BitmapFactory.decodeStream(is, null, options);
} catch (Exception e) {
e.printStackTrace();
}
}
return bitmap;
}
}
import roboguice.activity.GuiceActivity;
import roboguice.inject.InjectView;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
public class MainActivity extends GuiceActivity {
@SuppressWarnings("unused")
private final Activity self = this;
private final int REQUEST_PICK_CONTACT = 0;
@InjectView(R.id.gallery)
ImageButton mButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // Injection now!!
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_PICK_CONTACT);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_PICK_CONTACT) {
data.setClass(this, DotActivity.class);
Uri pictUri = data.getData();
if (pictUri != null) {
data.putExtra("mediaImageUri", pictUri);
startActivity(data);
}
}
}
}
import roboguice.activity.GuiceActivity;
import roboguice.inject.InjectView;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import com.google.inject.Inject;
public class ReceiveActivity extends GuiceActivity {
@SuppressWarnings("unused")
private final Activity self = this;
// Powered by BitmapFromUriExtraProvider
@Inject
private Bitmap mBGBitmap;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dot); // Injection now!!
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment