首页 > 编程技术 > android

android对网络图片保留缓存 随时加载

发布时间:2016-9-20 19:58

最近开发的android应用中写了一个加载网络图片并保留缓存的类,可随时点击打开,这样速度快了很多,分享给大家参考。

实现原理就是从网上下载图片数据,一边将数据转成drawable并加载到指定的imageview

一边保存成download_image.jpg,在点击imageview时候用intent将图片打开


我将处理图片的过程写成了类

package com.example.downloadandopenimage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class LoadAndSaveImage {
    ImageView view;
    Context mContext;

    public LoadAndSaveImage() {
        // TODO Auto-generated constructor stub
    }

    public LoadAndSaveImage(Context context, String str, ImageView view) {
        // TODO Auto-generated constructor stub
        this.view = view;
        mContext = context;
        new Load_and_save_image().execute(str);
    }

    void release() {
        File file = new File("file://"
                + Environment.getExternalStorageDirectory().toString()
                + "/download_image.jpg");
        if (file.exists()) {
            boolean deleted = file.delete();
        }
    }

    class Load_and_save_image extends AsyncTask<String, Void, Void> {

        @Override
        protected Void doInBackground(String... sUrl) {
            // TODO Auto-generated method stub
            InputStream input = null;
            OutputStream output = null;
            HttpURLConnection connection = null;
            try {
                URL url = new URL(sUrl[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();

                // download the file
                input = connection.getInputStream();
                File checker = new File("file://"
                        + Environment.getExternalStorageDirectory().toString()
                        + "/download_image.jpg");
                if (checker.exists()) {
                    boolean deleted = checker.delete();
                }
                output = new FileOutputStream(Environment
                        .getExternalStorageDirectory().toString()
                        + "/download_image.jpg");

                byte data[] = new byte[4096];
                int count;
                while ((count = input.read(data)) != -1) {
                    output.write(data, 0, count);
                }
            } catch (Exception e) {
            } finally {
                try {
                    if (input != null)
                        input.close();
                    if (output != null) {
                        output.close();
                    }
                } catch (IOException ignored) {
                }

                if (connection != null)
                    connection.disconnect();
            }
            return null;
        }

        protected void onPostExecute(Void result) {
            Drawable d = Drawable.createFromPath(Environment
                    .getExternalStorageDirectory().toString()
                    + "/download_image.jpg");
            view.setImageDrawable(d);
            view.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setDataAndType(Uri.parse("file://"
                            + Environment.getExternalStorageDirectory()
                                    .toString() + "/download_image.jpg"),
                            "image/*");
                    mContext.startActivity(intent);
                }
            });
        };
    }

}


只要在activity中这样写:

    image = (ImageView) findViewById(R.id.image);
        new LoadAndSaveImage(getApplicationContext(), "http://toolongdidntread.com/wp-content/uploads/2011/06/upload.png", image);


三个参数分别是content,图片的url,你要加载的imageview

BTW,由于这里设置的储存的jpg文件名字是固定的,加载多张图片时请用随机数或者自行命名

Android开发,ViewPager,ScrollView,嵌套滚动

最里面的ViewPager水平滚动时总是会触发最外层的ViewPager滚动,需要自定义ViewPager。

import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * 自定义ViewPager,解决ViewPagger嵌套使用时不滑动问题。
 * Created by Administrator on 2015/4/20.
 */
public class HorizontalInnerViewPager extends ViewPager {
    /** 触摸时按下的点 **/
    PointF downP = new PointF();
    /** 触摸时当前的点 **/
    PointF curP = new PointF();


    public HorizontalInnerViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(context, new XScrollDetector());
    }
    public HorizontalInnerViewPager(Context context) {
        super(context);

        mGestureDetector = new GestureDetector(context, new XScrollDetector());
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);//default
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        //每次进行onTouch事件都记录当前的按下的坐标
        curP.x = ev.getX();
        curP.y = ev.getY();

        if(ev.getAction() == MotionEvent.ACTION_DOWN){
            //记录按下时候的坐标
            //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
            downP.x = ev.getX();
            downP.y = ev.getY();
            //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
            getParent().requestDisallowInterceptTouchEvent(true);
        }

        if(ev.getAction() == MotionEvent.ACTION_MOVE){
            //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
                getParent().requestDisallowInterceptTouchEvent(true);
        }

        return super.onTouchEvent(ev);
    }

}


解决了上面的问题,又出现了新的问题,当最里面的ViewPager垂直滚动时外层的ScrollView并不会滚动,解决方法如下:

import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;

/**
 * 自定义ViewPager,解决ViewPagger嵌套使用时不滑动问题。
 * Created by Administrator on 2015/4/20.
 */
public class HorizontalInnerViewPager extends ViewPager {
    /** 触摸时按下的点 **/
    PointF downP = new PointF();
    /** 触摸时当前的点 **/
    PointF curP = new PointF();

    /** 自定义手势**/
    private GestureDetector mGestureDetector;

    public HorizontalInnerViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(context, new XScrollDetector());
    }
    public HorizontalInnerViewPager(Context context) {
        super(context);

        mGestureDetector = new GestureDetector(context, new XScrollDetector());
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);//default
        //当拦截触摸事件到达此位置的时候,返回true,
        //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
//        return true;
        //接近水平滑动时子控件处理该事件,否则交给父控件处理
//        return mGestureDetector.onTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        //每次进行onTouch事件都记录当前的按下的坐标
        curP.x = ev.getX();
        curP.y = ev.getY();

        if(ev.getAction() == MotionEvent.ACTION_DOWN){
            //记录按下时候的坐标
            //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
            downP.x = ev.getX();
            downP.y = ev.getY();
            //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
            getParent().requestDisallowInterceptTouchEvent(true);
        }

        if(ev.getAction() == MotionEvent.ACTION_MOVE){
            float distanceX = curP.x - downP.x;
            float distanceY = curP.y - downP.y;
            //接近水平滑动,ViewPager控件捕获手势,水平滚动
            if(Math.abs(distanceX) > Math.abs(distanceY)){
                //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
                getParent().requestDisallowInterceptTouchEvent(true);
            }else{
                //接近垂直滑动,交给父控件处理
                getParent().requestDisallowInterceptTouchEvent(false);
            }
        }

        return super.onTouchEvent(ev);
    }

    private class XScrollDetector extends GestureDetector.SimpleOnGestureListener{
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//            return super.onScroll(e1, e2, distanceX, distanceY);

            //接近水平滑动时子控件处理该事件,否则交给父控件处理
            return (Math.abs(distanceX) > Math.abs(distanceY));
        }
    }

}

密码字符串在开发过程中很常见,本文我们来分享在android开发时如何用MD5和SHA1加密,文章后面提示加密实例。


首先,我们来分享MD5和SHA1加密的函数。

public class MD5 {

private static String key = "a6U&1$Ip[Jr/sed]Rfvn=O>Mz+}lXN*%-gLcGD|0";

//MD5加密实例
public static String getMD5(String str) throws NoSuchAlgorithmException {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
e.printStackTrace();
return "";
}
char[] charArray = str.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++) {
byteArray[i] = (byte) charArray[i];
}
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}



public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs;
}

//SHA1 加密实例
public static  String encryptToSHA(String info) {
byte[] digesta = null;
try {
// 得到一个SHA-1的消息摘要
MessageDigest alga = MessageDigest.getInstance("SHA-1");
// 添加要进行计算摘要的信息
alga.update(info.getBytes());
// 得到该摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将摘要转为字符串
String rs = byte2hex(digesta);
return rs + key;
}
}

本文我们整理了三个android后台发送邮件的方法及示例,第一个是不借助Intent在android后台发送Email,第二个是用在收集应用的异常信息,第三个是分享一个android后台发送邮件的类。

android后台发送Email(不借助Intent)

Android的SDK使得它很容易从一个应用程序发送电子邮件,但只能通过Intent的方法,就是通过内置的邮件应用程序。这能满足大多数的需求,但如果你想在后台发送,就不行了。
在这篇文章中,我将告诉你怎样在没有用户干预的情况下,在后台发送一封电子邮件。

开始之前需要先下载一个特殊版本的JavaMail API,这是专门为Android编写的。

http://code.google.com/p/javamail-android/downloads/list


如果你被墙屏蔽了,也可以去这里下载,里面的附件里有全部需要的东西,包括如何在Android应用的Activity中使用:


我们开始吧,下面是对邮件发送功能的封装,使用这些方法可以很容易地发送电子邮件,甚至可以添加附件。

import java.util.Date;
import java.util.Properties;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
 
 
public class Mail extends javax.mail.Authenticator {
  private String _user;
  private String _pass;
 
  private String[] _to;
  private String _from;
 
  private String _port;
  private String _sport;
 
  private String _host;
 
  private String _subject;
  private String _body;
 
  private boolean _auth;
   
  private boolean _debuggable;
 
  private Multipart _multipart;
 
 
  public Mail() {
    _host = "smtp.gmail.com"; // default smtp server
    _port = "465"; // default smtp port
    _sport = "465"; // default socketfactory port
 
    _user = ""; // username
    _pass = ""; // password
    _from = ""; // email sent from
    _subject = ""; // email subject
    _body = ""; // email body
 
    _debuggable = false; // debug mode on or off - default off
    _auth = true; // smtp authentication - default on
 
    _multipart = new MimeMultipart();
 
    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mc);
  }
 
  public Mail(String user, String pass) {
    this();
 
    _user = user;
    _pass = pass;
  }
 
  public boolean send() throws Exception {
    Properties props = _setProperties();
 
    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
      Session session = Session.getInstance(props, this);
 
      MimeMessage msg = new MimeMessage(session);
 
      msg.setFrom(new InternetAddress(_from));
       
      InternetAddress[] addressTo = new InternetAddress[_to.length];
      for (int i = 0; i < _to.length; i++) {
        addressTo[i] = new InternetAddress(_to[i]);
      }
        msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
 
      msg.setSubject(_subject);
      msg.setSentDate(new Date());
 
      // setup message body
      BodyPart messageBodyPart = new MimeBodyPart();
      messageBodyPart.setText(_body);
      _multipart.addBodyPart(messageBodyPart);
 
      // Put parts in message
      msg.setContent(_multipart);
 
      // send email
      Transport.send(msg);
 
      return true;
    } else {
      return false;
    }
  }
 
  public void addAttachment(String filename) throws Exception {
    BodyPart messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(filename);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);
 
    _multipart.addBodyPart(messageBodyPart);
  }
 
  @Override
  public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(_user, _pass);
  }
 
  private Properties _setProperties() {
    Properties props = new Properties();
 
    props.put("mail.smtp.host", _host);
 
    if(_debuggable) {
      props.put("mail.debug", "true");
    }
 
    if(_auth) {
      props.put("mail.smtp.auth", "true");
    }
 
    props.put("mail.smtp.port", _port);
    props.put("mail.smtp.socketFactory.port", _sport);
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");
 
    return props;
  }
 
  // the getters and setters
  public String getBody() {
    return _body;
  }
 
  public void setBody(String _body) {
    this._body = _body;
  }
 
  // more of the getters and setters …..
}

And now I'm going to go through each bit of code

 
public Mail() {
  _host = "smtp.gmail.com"; // default smtp server
  _port = "465"; // default smtp port
  _sport = "465"; // default socketfactory port
 
  _user = ""; // username
  _pass = ""; // password
  _from = ""; // email sent from
  _subject = ""; // email subject
  _body = ""; // email body
 
  _debuggable = false; // debug mode on or off - default off
  _auth = true; // smtp authentication - default on
 
  _multipart = new MimeMultipart();
 
  // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
  MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
  mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
  mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
  mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
  mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
  mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
  CommandMap.setDefaultCommandMap(mc);
}
 
public Mail(String user, String pass) {
  this();
 
  _user = user;
  _pass = pass;
}

在这段代码中,我们初始化了类mail属性,并设置为默认值。
另外,里面的JavaMail MIME类型需要注意看。里面有一个注释说明。
里面的两个2个构造函数也要仔细看,你可以通过其中一个传递用户名跟密码进去。

public boolean send() throws Exception {
  Properties props = _setProperties();
 
  if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
    Session session = Session.getInstance(props, this);
 
    MimeMessage msg = new MimeMessage(session);
 
    msg.setFrom(new InternetAddress(_from));
       
    InternetAddress[] addressTo = new InternetAddress[_to.length];
    for (int i = 0; i < _to.length; i++) {
      addressTo[i] = new InternetAddress(_to[i]);
    }
    msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
 
    msg.setSubject(_subject);
    msg.setSentDate(new Date());
 
    // setup message body
    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setText(_body);
    _multipart.addBodyPart(messageBodyPart);
 
    // Put parts in message
    msg.setContent(_multipart);
 
    // send email
    Transport.send(msg);
 
    return true;
  } else {
    return false;
  }
}

这是发送的方法,里面有设置了数据属性,然后执行了发送操作。


public void addAttachment(String filename) throws Exception {
  BodyPart messageBodyPart = new MimeBodyPart();
  DataSource source = new FileDataSource(filename);
  messageBodyPart.setDataHandler(new DataHandler(source));
  messageBodyPart.setFileName(filename);
 
  _multipart.addBodyPart(messageBodyPart);
}

这是添加附件的函数,不过需要在发送之前调用。


private Properties _setProperties() {
  Properties props = new Properties();
 
  props.put("mail.smtp.host", _host);
 
  if(_debuggable) {
    props.put("mail.debug", "true");
  }
 
  if(_auth) {
    props.put("mail.smtp.auth", "true");
  }
 
  props.put("mail.smtp.port", _port);
  props.put("mail.smtp.socketFactory.port", _sport);
  props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  props.put("mail.smtp.socketFactory.fallback", "false");
 
  return props;
}

在这里,我们设置了邮件认证的属性 - 默认是SMTP认证。
这是所有Gmail(谷歌)SMTP服务器连接。


Android 后台发送邮件 收集应用异常信息


这篇文章是实用性文章,不会涉及太多理论分析。主要是让大家看了以后知道怎么在自己的应用里面添加这个功能。下面附件Demo和关键代码是CSDN上面一个例子代码,我只把包链接和界面改了一下,方便阅读。因此不知道这Demo的原始作者是谁,如果您看到这是您的Demo代码,请跟我联系加入您的信息。

 (PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)

1、第三方库

这次发送后台邮件需要用到三个第三方的库,这几个库在java里面应该是比较有名的了。以前做个java 邮件开发的朋友,应该多多少少都会用过。Android默认发送邮件的方法,需要通过Intent调用系统邮件程序,这个对于我们这种后台操作不实用。

    activation.jar
    additionnal.jar
    mail.jar

下面我Demo例子里面会附上这三个包,这几个包网上也很多资源,可以自行下载。

 

2、邮件信息

因为我们是后台发送邮件,因此需要收集一些必要信息,因为不需要用户输入这些信息。

//Edited by mythou
//http://www.cnblogs.com/mythou/

public class MailSenderInfo
{
    // 发送邮件的服务器的IP和端口    
    private String mailServerHost;    
    private String mailServerPort = "25";   
    
    // 邮件发送者的地址    
    private String fromAddress;    
    // 邮件接收者的地址    
    private String toAddress;    
    // 登陆邮件发送服务器的用户名和密码    
    private String userName;    
    private String password;    
    // 是否需要身份验证    
    private boolean validate = true;    
    // 邮件主题    
    private String subject;    
    // 邮件的文本内容    
    private String content;    
    // 邮件附件的文件名    
    private String[] attachFileNames;      
}

上面这些都是我们发送邮件的时候需要用到的信息。这里需要注意的是,我们发送后台邮件需要给出账号密码等敏感信息。这些邮件信息,我们可以在程序里面编写好,这样我们发送邮件的时候,就不需要用户输入任何信息。

 

3、邮件发送

//Edited by mythou
//http://www.cnblogs.com/mythou/

   public boolean sendTextMail(MailSenderInfo mailInfo)
    {
        // 判断是否需要身份认证    
        MyAuthenticator authenticator = null;    
        Properties pro = mailInfo.getProperties();   
        if (mailInfo.isValidate())
        {    
            // 如果需要身份认证,则创建一个密码验证器    
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());    
        }   
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session    
        Session sendMailSession = Session.getDefaultInstance(pro,authenticator);    
        try
        {    
            // 根据session创建一个邮件消息    
            Message mailMessage = new MimeMessage(sendMailSession);    
            // 创建邮件发送者地址    
            Address from = new InternetAddress(mailInfo.getFromAddress());    
            // 设置邮件消息的发送者    
            mailMessage.setFrom(from);    
            // 创建邮件的接收者地址,并设置到邮件消息中    
            Address to = new InternetAddress(mailInfo.getToAddress());    
            mailMessage.setRecipient(Message.RecipientType.TO,to);    
            // 设置邮件消息的主题    
            mailMessage.setSubject(mailInfo.getSubject());    
            // 设置邮件消息发送的时间    
            mailMessage.setSentDate(new Date());    
            // 设置邮件消息的主要内容    
            String mailContent = mailInfo.getContent();    
            mailMessage.setText(mailContent);    
            // 发送邮件    
            Transport.send(mailMessage);   
            return true;    
        }
        catch (MessagingException ex)
        {    
            ex.printStackTrace();    
        }    
        return false;    
    }   

发送邮件主要是使用了mail.jar包里面的方法,首先会使用MyAuthenticator类判断一些用户验证信息,然后就是设置我们上面收集的邮件信息,最后会调用Transport.send()方法发送我们设置好的邮件。

跟我我个人测试效果,我是用QQ邮箱测试,发送的速度很快,调用发送接口,基本马上就能收到邮件了。下面提供的Demo例子里面也是基于QQ邮箱的,你可以根据需要修改一些邮箱参数(smtp、端口等信息)发送到其他邮箱服务器。利用这种方法,结合我前面一篇收集程序异常信息的文章,就可以把收集的异常信息发送到我们指定邮箱。

最后需要说明一点是,如果你是直接在后台发送邮件,最好给用户一个提示,或者让用户选择是否发送。否则容易背上流氓软件或者后台偷跑流量的骂名,O(∩_∩)O哈!另外也需要注意发送邮件的频率,避免发送太频繁,邮件服务商把你邮件屏蔽了。

android后台发送邮件类分享

public class SendEmail {
    private static final String TAG = "SendEmail";
    //要发送Email地址
    private String mailTo = null;
    //邮件发送来源地址
    private String mailFrom = null;
    //SMTP主机地址
    private String smtpHost = null;
    //是否启用调试
    private boolean debug = false;

    private String messageBasePath = null;
    //Email主题
    private String subject;

    public void setMailTo(String mailTo) {
        this.mailTo = mailTo;
    }

    public void setMailFrom(String mailFrom) {
        this.mailFrom = mailFrom;
    }

    public void setSmtpHost(String smtpHost) {
        this.smtpHost = smtpHost;
    }

    public void setDebug(boolean debug) {
        this.debug = debug;
    }

    public void setMessageBasePath(String messageBasePath) {
        this.messageBasePath = messageBasePath;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public void setMsgContent(String msgContent) {
        this.msgContent = msgContent;
    }

    public void setAttachedFileList(Vector attachedFileList) {
        this.attachedFileList = attachedFileList;
    }

    public void setEmailAccount(String emailAccount) {
        this.emailAccount = emailAccount;
    }

    public void setEmailPwd(String emailPwd) {
        this.emailPwd = emailPwd;
    }

    public void setMessageContentType(String messageContentType) {
        this.messageContentType = messageContentType;
    }

    public void setEmailbccTo(String emailbccTo) {
        this.emailbccTo = emailbccTo;
    }

    public void setEmailccTo(String emailccTo) {
        this.emailccTo = emailccTo;
    }

    //Email内容
    private String msgContent;

    private Vector attachedFileList;
    private String emailAccount = null;
    private String emailPwd = null;
    private String messageContentType = "text/html;charset=utf-8";

    private String emailbccTo = null;
    private String emailccTo = null;

    /*
    默认构造函数
     */
    public SendEmail() {
        super();
    }

    private void writeEmail(Session session, Message message) throws MessagingException {
        String fileName;
        Multipart multipart = new MimeMultipart();
        //设定发件人地址
        if (mailFrom != null) {
            message.setFrom(new InternetAddress(mailFrom));
            Log.i(TAG, "发件人邮件地址:" + mailFrom);
        } else {
            Log.i(TAG, "没有指定发件人邮件地址");
            return;
        }
        //设定收件人地址
        if (mailTo != null) {
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo));
            Log.i(TAG, "收件人邮件地址:" + mailTo);
        } else {
            Log.i(TAG, "没有指定收件人邮件地址");
            return;
        }
        //设定抄送地址
        if (emailccTo != null) {
            message.setRecipient(Message.RecipientType.CC, new InternetAddress(emailccTo));
            Log.i(TAG, "抄送邮件地址:" + emailccTo);
        } else {
            Log.i(TAG, "没有指定抄送邮件地址");
            return;
        }
        //设定密送地址
        if (emailbccTo != null) {
            message.setRecipient(Message.RecipientType.BCC, new InternetAddress(emailbccTo));
            Log.i(TAG, "密送邮件地址:" + emailbccTo);
        } else {
            Log.i(TAG, "没有指定密送邮件地址");
            return;
        }
        //设置邮件主题
        message.setSubject(subject);
        Log.i(TAG, "邮件主题:" + subject);
        //设置回复地址
        message.setReplyTo(new InternetAddress[]{new InternetAddress(mailFrom)});
        //创建并设置第一部分
        MimeBodyPart bodyPart = new MimeBodyPart();
        if (msgContent != null) {
            Log.i(TAG, "邮件内容:" + msgContent);
            bodyPart.setContent(msgContent, messageContentType);
        } else {
            bodyPart.setContent("", messageContentType);
        }
        multipart.addBodyPart(bodyPart);
        //附件文件到邮件中
        if (attachedFileList != null) {
            for (Enumeration fileList = attachedFileList.elements(); fileList.hasMoreElements(); ) {
                fileName = (String) fileList.nextElement();
                MimeBodyPart mBodyPart = new MimeBodyPart();

                FileDataSource fds = new FileDataSource(messageBasePath + fileName);
                Log.i(TAG, "Email发送的附件为:" + messageBasePath + fileName);
                mBodyPart.setDataHandler(new DataHandler(fds));
                mBodyPart.setFileName(fileName);
                multipart.addBodyPart(mBodyPart);
            }
        }
        Log.i(TAG, "设置邮件部分");
        message.setContent(multipart);
        message.setSentDate(new Date());
    }

    /**
     * 发送邮件方法
     *
     * @return true 表示发送成功,false表示不成功
     */
    public boolean sendEmail() {
        int loopCount;
        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", smtpHost);
        properties.setProperty("mail.smtp.auth", "true");
        properties.put("mail.smtp.port", "25");
        MailAuthenticator authenticator = new MailAuthenticator();
        Session session = Session.getInstance(properties, authenticator);
        session.setDebug(debug);
        MimeMessage mimeMessage = new MimeMessage(session);

//这里如果用Transport的话会出现错误
        SMTPTransport transport = new SMTPTransport(session, new URLName("smtp", "smtp.qq.com", 25, null, MailAuthenticator.TENCENT_EMAIL_USER, MailAuthenticator.TENCENT_EMAIL_PWD));
        try {
            writeEmail(session, mimeMessage);
            //transport = session.getTransport("smtp");
            try {
                Log.i(TAG, "开始连接服务器");
                transport.connect(smtpHost, 25, MailAuthenticator.TENCENT_EMAIL_USER, MailAuthenticator.TENCENT_EMAIL_PWD);
            } catch (AuthenticationFailedException e) {
                e.printStackTrace();
                Log.i(TAG, "连接服务器失败");
                return false;
            } catch (MessagingException e) {
                e.printStackTrace();
                Log.i(TAG, "发送邮件过程中出现错误");
                return false;
            }
            Log.i(TAG, "开始发送邮件");
            transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
            transport.close();
            Log.i(TAG, "关闭连接");
        } catch (MessagingException e) {
            e.printStackTrace();
            Log.i(TAG, "发送邮件失败");
            return false;
        } finally {
            try {
                if (transport != null && transport.isConnected()) {
                    transport.close();
                    Log.i(TAG, "在finally中关闭连接");
                }
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
        Log.i(TAG, "邮件发送成功");
        return true;
    }
}

tips---其中的MyAuthenticator类继承自Authenticator,重写这个方法即可

@Override
protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(邮箱用户名,密码);
}



android手机安装包频繁提示解析错误怎么解决呢?解析错误一下是包有问题或不是安卓系统所支持的安装包了,下面我们一起来看问题的一个解决办法。

 Android操作系统作为目前唯一可以与苹果iOS系统平分秋色的一款新生系统,它之所以成长的如此之快,除了其很强的开源性,Android系统一个很大的优势就在于其海量增长的应用程序。一款好玩的应用程序是充实闲暇时光的一柄利器,当我们新入手一款Android手机,慢慢熟悉后或多或少都会想到丰富其内置的应用程序,看到好玩的游戏或软件都会想要下载安装。而如果大家的Android手机在安装apk程序途中弹出“解析包时出现问题”这样的提示,会不会觉得很揪心呢?那么Android解析包出现问题有没有好的解决办法呢?

安卓android手机安装包频繁提示解析错误解决方法1

    安卓android手机安装包频繁提示解析错误解决方法介绍:

一、应用程序本身问题

  Android apk程序解析包出现问题的话,可能是由于你下载的apk程序本身就有问题,程序的压缩包可能在下载过程中被损坏了,建议请重新下载一次。

二、系统版本不支持

  如果重新下载也解决不了Android解析包出现问题的话,很大一个可能就是在于你的手机的配置参数不支持这款软件,举个例子吧,如果一款apk程序的系统版本要求在Android 4.0以上,而你的手机则是Android 2.3系统,就会出现“解析包时出现问题”这样的解析错误。

安卓android手机安装包频繁提示解析错误解决方法2

三、RE管理器设置问题

  进入RE管理器——设置——常规设置——主文件夹选项,有的网友反映如果将其设置成“sdcard\ ”就会出现“解析包出现问题”的错误提示,而如果将其设置“\ ”就可以成功安装,大家也可以试试!

安卓android手机安装包频繁提示解析错误解决方法3

以上就是安卓android手机安装包频繁提示解析错误解决方法的全部内容,遇到这种情况的朋友可以照着以上方法进行尝试!

标签:[!--infotagslink--]

您可能感兴趣的文章: