实现原理就是从网上下载图片数据,一边将数据转成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文件名字是固定的,加载多张图片时请用随机数或者自行命名
最里面的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));
}
}
}
首先,我们来分享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后台发送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操作系统作为目前唯一可以与苹果iOS系统平分秋色的一款新生系统,它之所以成长的如此之快,除了其很强的开源性,Android系统一个很大的优势就在于其海量增长的应用程序。一款好玩的应用程序是充实闲暇时光的一柄利器,当我们新入手一款Android手机,慢慢熟悉后或多或少都会想到丰富其内置的应用程序,看到好玩的游戏或软件都会想要下载安装。而如果大家的Android手机在安装apk程序途中弹出“解析包时出现问题”这样的提示,会不会觉得很揪心呢?那么Android解析包出现问题有没有好的解决办法呢?
安卓android手机安装包频繁提示解析错误解决方法介绍:
一、应用程序本身问题
二、系统版本不支持
如果重新下载也解决不了Android解析包出现问题的话,很大一个可能就是在于你的手机的配置参数不支持这款软件,举个例子吧,如果一款apk程序的系统版本要求在Android 4.0以上,而你的手机则是Android 2.3系统,就会出现“解析包时出现问题”这样的解析错误。
三、RE管理器设置问题
进入RE管理器——设置——常规设置——主文件夹选项,有的网友反映如果将其设置成“sdcard\ ”就会出现“解析包出现问题”的错误提示,而如果将其设置“\ ”就可以成功安装,大家也可以试试!
以上就是安卓android手机安装包频繁提示解析错误解决方法的全部内容,遇到这种情况的朋友可以照着以上方法进行尝试!