我使用图像下载器将一些图像从互联网显示到我的列表视图。图像使用哈希码存储在 sd 卡中。我如何通过电子邮件共享这些图像。在默认的 Gmail 客户端显示我已附加图像。但实际上主要我看不到任何附件。只有电子邮件正文可用。这是我使用的代码
活动
public class MainActivity extends Activity {
public static final String arrGroupelements[] = { "http://api.androidhive.info/music/images/adele.png",
"http://api.androidhive.info/music/images/eminem.png", "http://api.androidhive.info/music/images/mj.png"
};
ListView lv;
Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intializeviews();
ImgAdapter adapter = new ImgAdapter(MainActivity.this, arrGroupelements);
lv.setAdapter(adapter);
setListenersForViews();
}
private void setListenersForViews() {
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(arrGroupelements.length>0)
{
Intent mailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
mailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,new String[]{""});
mailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Hows the pic");
ArrayList<Uri> uris = new ArrayList<Uri>();
String mailText = "";
for(int i=0;i<arrGroupelements.length;i++)
{
String ImagePath = arrGroupelements[i].toString();
StringBuilder builder = new StringBuilder();
String sampleFile= Download(ImagePath);
mailText = mailText+"i shared "+ImagePath;
try
{
ContentValues values = new ContentValues(7);
values.put(Images.Media.TITLE, sampleFile);
values.put(Images.Media.DISPLAY_NAME, ImagePath);
values.put(Images.Media.DATE_TAKEN, new Date().getTime());
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put(Images.ImageColumns.BUCKET_ID, sampleFile.hashCode());
values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, sampleFile);
values.put("_data", sampleFile);
ContentResolver contentResolver = getApplicationContext().getContentResolver();
Uri uri = contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values);
uris.add(uri);
}
catch (Exception e)
{
}
}
Bundle bundle = new Bundle();
mailIntent.putExtra(Intent.EXTRA_TEXT, mailText);
mailIntent.putParcelableArrayListExtra(android.content.Intent.EXTRA_STREAM, uris);
mailIntent.setType("multipart/mixed");
startActivityForResult(Intent.createChooser(mailIntent, "Choose client"),500);
}
}
private String Download(String url) {
String filename = String.valueOf(url.hashCode());
File f = new File(android.os.Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator +"data/test/images/", filename+".png");
if(f.isFile())
{
return android.os.Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator +"data/test/images/"+File.separator+ filename+".png";
}
return "";
}
});
}
private void Intializeviews() {
lv=(ListView)findViewById(R.id.lv);
btn=(Button)findViewById(R.id.btn);
}
}
图像适配器
public class ImgAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] names;
ImageDownloader downloader;
public ImgAdapter(Activity context, String[] names) {
super(context, R.layout.lvrow, names);
this.context = context;
this.names = names;
Log.e("size of names is ", String.valueOf(names.length));
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.lvrow, null, true);
ImageView img = (ImageView) rowView.findViewById(R.id.img);
String url = names[position].toString();
downloader = new ImageDownloader();
downloader.download(url, img);
return rowView;
}
}
图像下载器
public class ImageDownloader {
Map<String,Bitmap> imageCache;
public ImageDownloader(){
imageCache = new HashMap<String, Bitmap>();
}
//download function
public void download(String url, ImageView imageView) {
if (cancelPotentialDownload(url, imageView)&&url!=null) {
//Caching code right here
String filename = String.valueOf(url.hashCode());
File f = new File(getCacheDirectory(imageView.getContext()), filename);
// Is the bitmap in our memory cache?
Bitmap bitmap = null;
bitmap = (Bitmap)imageCache.get(f.getPath());
BitmapFactory.Options bfOptions=new BitmapFactory.Options();
bfOptions.inDither=false; //Disable Dithering mode
bfOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bfOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bfOptions.inTempStorage=new byte[32 * 1024];
FileInputStream fs=null;
if(bitmap == null){
//bitmap = BitmapFactory.decodeFile(f.getPath(),options);
try {
fs = new FileInputStream(f);
if(fs!=null) bitmap=BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions);
} catch (IOException e) {
//TODO do something intelligent
e.printStackTrace();
} finally{
if(fs!=null) {
try {
fs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if(bitmap != null){
imageCache.put(f.getPath(), bitmap);
}
}
//No? download it
if(bitmap == null){
BitmapDownloaderTask task = new BitmapDownloaderTask(imageView);
DownloadedDrawable downloadedDrawable = new DownloadedDrawable(task);
imageView.setImageDrawable(downloadedDrawable);
task.execute(url);
}else{
//Yes? set the image
imageView.setImageBitmap(bitmap);
}
}
}
//cancel a download (internal only)
private static boolean cancelPotentialDownload(String url, ImageView imageView) {
BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
if (bitmapDownloaderTask != null) {
String bitmapUrl = bitmapDownloaderTask.url;
if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) {
bitmapDownloaderTask.cancel(true);
} else {
// The same URL is already being downloaded.
return false;
}
}
return true;
}
//gets an existing download if one exists for the imageview
private static BitmapDownloaderTask getBitmapDownloaderTask(ImageView imageView) {
if (imageView != null) {
Drawable drawable = imageView.getDrawable();
if (drawable instanceof DownloadedDrawable) {
DownloadedDrawable downloadedDrawable = (DownloadedDrawable)drawable;
return downloadedDrawable.getBitmapDownloaderTask();
}
}
return null;
}
//our caching functions
// Find the dir to save cached images
public static File getCacheDirectory(Context context){
String sdState = android.os.Environment.getExternalStorageState();
File cacheDir;
if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
File sdDir = android.os.Environment.getExternalStorageDirectory();
//TODO : Change your diretcory here
cacheDir = new File(sdDir,"data/test/images");
}
else
cacheDir = context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
return cacheDir;
}
private void writeFile(Bitmap bmp, File f) {
FileOutputStream out = null;
try {
out = new FileOutputStream(f);
bmp.compress(Bitmap.CompressFormat.PNG, 80, out);
} catch (Exception e) {
e.printStackTrace();
}
finally {
try { if (out != null ) out.close(); }
catch(Exception ex) {}
}
}
///////////////////////
//download asynctask
public class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
private String url;
private final WeakReference<ImageView> imageViewReference;
public BitmapDownloaderTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
// Actual download method, run in the task thread
protected Bitmap doInBackground(String... params) {
// params comes from the execute() call: params[0] is the url.
url = (String)params[0];
return downloadBitmap(params[0]);
}
@Override
// Once the image is downloaded, associates it to the imageView
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
// Change bitmap only if this process is still associated with it
if (this == bitmapDownloaderTask) {
imageView.setImageBitmap(bitmap);
//cache the image
String filename = String.valueOf(url.hashCode());
File f = new File(getCacheDirectory(imageView.getContext()), filename);
imageCache.put(f.getPath(), bitmap);
writeFile(bitmap, f);
}
}
}
}
static class DownloadedDrawable extends ColorDrawable {
private final WeakReference<BitmapDownloaderTask> bitmapDownloaderTaskReference;
public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) {
super(Color.BLACK);
bitmapDownloaderTaskReference =
new WeakReference<BitmapDownloaderTask>(bitmapDownloaderTask);
}
public BitmapDownloaderTask getBitmapDownloaderTask() {
return bitmapDownloaderTaskReference.get();
}
}
//the actual download code
static Bitmap downloadBitmap(String url) {
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient client = new DefaultHttpClient(params);
final HttpGet getRequest = new HttpGet(url);
try {
HttpResponse response = client.execute(getRequest);
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url);
return null;
}
final HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = null;
try {
inputStream = entity.getContent();
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
} finally {
if (inputStream != null) {
inputStream.close();
}
entity.consumeContent();
}
}
} catch (Exception e) {
// Could provide a more explicit error message for IOException or IllegalStateException
getRequest.abort();
Log.w("ImageDownloader", "Error while retrieving bitmap from " + url + e.toString());
} finally {
if (client != null) {
//client.close();
}
}
return null;
}
}
活动主
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email Share" />
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="fill_parent" >
</ListView>
</LinearLayout>
lvrow
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/darker_gray"
>
<ImageView
android:id="@+id/img"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/ic_launcher"
/>
</LinearLayout>
显现
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.multipleemailattachment"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我错过了什么吗?