过去一段时间一直有人和我说下载图片太多有时候会溢出内存 问我有啥办法,我说我也不知道除了把照片像素 参数缩小该一下,今天看源码的时候看见了SoftReference这个东西,我不知道干啥用的搜索了一下就是为了内存问题而应用的,而且好多地方用到了,我把他取出来弄了一下下载照片处理的方法,不过是handler处理的,如果用asn处理会更好一些吧
public DrawableManager() {
drawableMap = new HashMap<String, SoftReference<Drawable>>();
}
public Drawable fetchDrawable(String urlString) {
SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
if (drawableRef != null) {
Drawable drawable = drawableRef.get();
if (drawable != null)
return drawable;
drawableMap.remove(urlString);
}
if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
drawableRef = new SoftReference<Drawable>(drawable);
drawableMap.put(urlString, drawableRef);
if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
+ drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
+ drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
return drawableRef.get();
} catch (MalformedURLException e) {
if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
} catch (IOException e) {
if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
}
}
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
if (drawableRef != null) {
Drawable drawable = drawableRef.get();
if (drawable != null) {
imageView.setImageDrawable(drawableRef.get());
return;
}
// Reference has expired so remove the key from drawableMap
drawableMap.remove(urlString);
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
imageView.setImageDrawable((Drawable) message.obj);
}
};
Thread thread = new Thread() {
@Override
public void run() {
//TODO : set imageView to a "pending" image
Drawable drawable = fetchDrawable(urlString);
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
};
thread.start();
}
public class CameraPreview extends Activity { private Preview mPreview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Hide the window title. requestWindowFeature(Window.FEATURE_NO_TITLE); // Create our Preview view and set it as the content of our activity. mPreview = new Preview(this,this); setContentView(mPreview); mPreview.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(!mPreview.onProgress) mPreview.onClick(); } }); } } // ---------------------------------- class Preview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; Camera mCamera; Context CON; Activity ACT; public boolean onProgress=false; Preview(Context context,Activity activity) { super(context); CON=context; ACT=activity; // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); } catch (IOException exception) { mCamera.release(); mCamera = null; // TODO: add more exception handling logic here } } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. // Because the CameraDevice object is not a shared resource, it's very // important to release it when the activity is paused. mCamera.stopPreview(); mCamera.release(); mCamera = null; } private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.05; double targetRatio = (double) w / h; if (sizes == null) return null; Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; // Try to find an size match aspect ratio and size for (Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { onProgress=true; if (imageData != null) { Intent mIntent = new Intent(); try { FileOutputStream out = new FileOutputStream( "/sdcard/Deltio1.jpg"); Bitmap e = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); e.compress(Bitmap.CompressFormat.JPEG, 65, out); out.close(); Intent i = new Intent(ACT, MediaSend.class); ACT.startActivity(i); } catch (Exception e) { Toast .makeText( CON, "Πρόβλημα στην αποθήκευση.Βεβαιωθείτε ότι έχετε sdcard εγκατεστημένη", Toast.LENGTH_LONG).show(); ACT.finish(); } // FileUtilities.StoreByteImage(mContext, imageData, // 50, "ImageName"); SystemClock.sleep(2000); mCamera.startPreview(); onProgress=false; // setResult(FOTO_MODE,mIntent); // finish(); } } }; public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = mCamera.getParameters(); //List<Size> sizes = parameters.getSupportedPreviewSizes(); //Size optimalSize = getOptimalPreviewSize(sizes, w, h); //parameters.setPreviewSize(optimalSize.width, optimalSize.height); parameters.setPreviewSize(w, h); //mCamera.setParameters(parameters); mCamera.startPreview(); } public void onClick() { if(!onProgress) {onProgress=true; mCamera.takePicture(null, mPictureCallback, mPictureCallback); } } } <!-- Page not cached by WP Super Cache. No closing HTML tag. Check your theme. -->
2.
public class CameraPreview extends Activity { protected static final String TAG = "CameraPreview"; private Preview mPreview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Hide the window title. requestWindowFeature(Window.FEATURE_NO_TITLE); // Create our Preview view and set it as the content of our activity. mPreview = new Preview(this); mPreview.setId(100); RelativeLayout mainLayout = new RelativeLayout(this); RelativeLayout.LayoutParams mainLp = new RelativeLayout.LayoutParams(640, 480); mainLp.leftMargin = 20; mainLayout.addView(mPreview, mainLp); Button btn = new Button(this); btn.setOnClickListener(new OnClickListener(){ public void onClick(View v) { RelativeLayout.LayoutParams nLp = (LayoutParams) mPreview.getLayoutParams(); nLp.leftMargin += 10; Log.v(TAG,"nLp.leftMargin: " + nLp.leftMargin); mPreview.setLayoutParams(nLp); } }); btn.setText("Click me!"); RelativeLayout.LayoutParams btnLp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); btnLp.addRule(RelativeLayout.BELOW, mPreview.getId()); mainLayout.addView(btn ,btnLp); setContentView(mainLayout); }
}
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
用上面的方法发送邮件可行,但是如果你里面的程序较多 好多程序都可以供你选择
想缩小一下范围可以用
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body);
intent.setData(data);
startActivity(intent);
Uri data = Uri.parse("mailto:?subject=" + subject + "&body=" + body);