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
所以经过上述,源程序做了如下更改
使用调用手机上的其他程序完成邮件发送,但是如果用户手机上没有邮箱客户端就坑爹了,并且影响程序的美观,放弃这个方案。
使用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工具类
那么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(); } }; }
相关文章推荐
- android 应用程序意见反馈
- Android应用中意见反馈功能的探讨与实现
- Android开发_如何实现留言意见反馈功能界面
- Android面试补习(六)浅谈Android事件分发机制(对CSDN移动端的填坑意见反馈)
- Android用户体验之意见反馈的重要
- Android应用中意见反馈功能的探讨与实现
- Android程序开发意见反馈的实现
- 如何为Android应用设计意见反馈
- Android应用中意见反馈功能的探讨与实现
- android 双服务常驻后台:防止意见清理
- Android+PHP+Mysql实现用户反馈功能
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现(第二版)
- Android 学习记录-UDACITY项目0反馈
- Android OpenGL触摸反馈
- android 触屏反馈原理
- 求各位大侠给些学习android意见或建议。
- [小代码]设定邮件内容,发送邮件(适用于意见反馈功能)
- android应用捕获运行异常发送反馈邮件的实现
- Android不被kill的Service与卸载之后跳转出反馈页面
- php 判断每人每天只能提交一次意见反馈的接口的实现