您的位置:首页 > 移动开发 > Android开发

android 意见反馈

2014-04-02 09:27 453 查看
最近Android软件程序要添加意见反馈功能,我想三个方案:

使用调用手机上的其他程序完成邮件发送,但是如果用户手机上没有邮箱客户端就坑爹了,并且影响程序的美观,放弃这个方案。

使用javamail完成邮件发送

利用我现有sae建立一个邮箱转发服务器,可是我对php语言不熟,实现起来比较麻烦。

综上决定采用第二种方案

直接在网上撸了段代码拿来用,结果发送不成功,我想是不是邮箱配置错了,下了个foxmail,根据foxmail的邮件配置,重新填了一下,还是没法发送。

后来想到是不是Androidmainfest没配置权限,配置好了,代码也对,还是发送不了,一点击button就提示system.err at onclick(),就是说onclick事件错误,后来突然发现从2.3开始,联网的Android程序需要用StrictMode,于是添加StrictMode,运行ok,邮件发送成功。

javamail使用详细过程如下:

http://code.google.com/p/javamail-android/,下载additionnal.jar、mail.jar、activation.jar 三个包,,把那三个jar包都添加到程序。

添加Androidmainfest权限 <uses-permission android:name="android.permission.INTERNET" />放在application外面

新建一个MailUtil工具类

4.发送邮件
现在可以发送邮件了、

那么strickmode到底干什么用的?

http://developer.android.com/reference/android/os/StrictMode.html



由此可知主要用于,当使用磁盘和网络连接的时候,会帮助程序员发现潜在的错误

如果在主线程中访问网络或者读写磁盘或者数据库的读写等做一些很耗时的操作,logcat将会输出错误信息

如:

02-27 10:03:56.122: DEBUG/StrictMode(16210): StrictMode policy violation; ~duration=696 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2

02 02-27 10:03:56.122: DEBUG/StrictMode(16210): at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745)

通过分析logcat信息,我们可以找出程序潜在的界面无响应,进一步优化代码。

推荐的使用StrictMode的方式是,在开发阶段,打开它,在发布应用前,关闭它。

Java代码


public void onCreate() {

if (DEVELOPER_MODE) {

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() //构造StrictMode

.detectDiskReads() //当发生磁盘读操作时输出

.detectDiskWrites()//当发生磁盘写操作时输出

.detectNetwork() //访问网络时输出,这里可以替换为detectAll() 就包括了磁盘读写和网络I/O

.penaltyLog() //以日志的方式输出

.build());

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

.detectLeakedSqlLiteObjects() //探测SQLite数据库操作

.penaltyLog() //以日志的方式输出

.penaltyDeath()

.build());

}

super.onCreate();

上面的内容是引自 http://fariytale.iteye.com/blog/1293530
所以经过上述,源程序做了如下更改

package com.bqkj.amesdial;

import javax.mail.MessagingException;

import com.bqkj.amesdial.util.DialogFactory;
import com.bqkj.amesdial.util.MailUtil;

import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;

import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.inputmethod.EditorInfo;

import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

import android.widget.Toast;

public class SendMailActivity extends Activity {

private String txt_conts = null;
private String txt2_phone = null;
private Context context = null;
private EditText contens = null;
private EditText email = null;

private Dialog mDialog = null;

private void showRequestDialog() {
if (mDialog != null) {
mDialog.dismiss();
mDialog = null;
}
mDialog = DialogFactory.creatRequestDialog(this, "发送邮件中...");
mDialog.setCanceledOnTouchOutside(false);
mDialog.show();
}

@Override
protected void onCreate(Bundle savedInstanceState) {

// 联网程序,需要加上StrictMode
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());

super.onCreate(savedInstanceState);
setContentView(R.layout.post_email);

context = this.getApplicationContext();

contens = (EditText) findViewById(R.id.ed_contents);
email = (EditText) findViewById(R.id.ed_emial);
ActionBar bar = getActionBar(); // 获取ActionBar的对象,从这个方法也可知action
// bar是activity的一个属性
bar.setDisplayHomeAsUpEnabled(true); // 显示返回的箭头,并可通过onOptionsItemSelected()进行监听,其资源ID为android.R.id.home。

// txt_conts = contens.getText().toString();
// txt2_phone = email.getText().toString();这样肯定获取不到EditText的内容

email.setOnEditorActionListener(new OnEditorActionListener() {

@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// showRequestDialog();
txt_conts = contens.getText().toString().trim();
txt2_phone = email.getText().toString().trim();

int txt_conts1 = txt_conts.length();
int txt2_phone2 = txt2_phone.length();

if (txt_conts1 >= 1 && txt2_phone2 >= 1) {
showRequestDialog();
new Thread() {
public void run() {
try {
MailUtil.snedMail("新风Android软件意见反馈",
txt_conts + "\n"
+ "---------------------"
+ "\n" + txt2_phone);
myHandler.sendEmptyMessage(2);
} catch (MessagingException e) {
// TODO Auto-generated catch block
myHandler.sendEmptyMessage(1);
}
}
}.start();

} else {
myHandler.sendEmptyMessage(3);
}
}
return false;
}
});
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: // 对用户按home
// icon的处理,本例只需关闭activity,就可返回上一activity,即主activity。
Intent i = new Intent(this, AboutActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);// 清空原来的MainActivity,重新建一个,如果有蓝牙连接的话,就会断开,请注意!!
startActivity(i);

return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}

Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String messs = "";
switch (msg.what) {
case 1:
messs = "发送失败!";
mDialog.dismiss();
Thread.currentThread().interrupt();
break;
case 2:
messs = "发送成功!";
mDialog.dismiss();
Thread.currentThread().interrupt();
break;
case 3:
messs = "发送内容不能为空!";
break;

default:
break;
}
Toast.makeText(context, messs, Toast.LENGTH_LONG).show();

}
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: