现在的项目需要从自己的应用打开邮箱,在做更

时间:2019-09-30 15:37来源:美高梅手机游戏网站
前言 我从2014年开始接触Android开发,作为一个非科班出身的女程序员,我在android这条道上已经走了3年。三年中,参加了大大小小快10个项目。经历了种种的坑,在不停学习的同时,我想

前言

我从2014年开始接触Android开发,作为一个非科班出身的女程序员,我在android这条道上已经走了3年。三年中,参加了大大小小快10个项目。经历了种种的坑,在不停学习的同时,我想自己应该把这些我与Android的事情写下来。用我自己的经历,解决大家一些问题。同时,如果有更好的解决方法,希望大家能够提出来,一起学习。

前言

公司以前有个需求,需要使用导航,但是工期很短,那么怎么解决呢?我们想到了URL Scheme来实现

Android6.0的时候增加了android运行时权限,在7.0的时候权限又增加了,可能这也是android越来越安全的一个做法吧.

如何从自己的应用打开邮箱

现在的公司是一个日企,很多需求和国内有很大的不同,比如说UI,日本喜欢可爱的画面,每个页面都是填充的满满的;比如说功能设计;比如说习惯操作和我们有很多不一样等等。这给我带来了很多苦恼。这些都将在后面慢慢的和大家介绍。

现在的项目需要从自己的应用打开邮箱。这是一个很简单的功能,相信很多朋友都做过通过自己的app发送邮件、短信等等。但是就是这么一个简单的功能,确难倒我了。

明确的需求:点击“open”按钮,打开邮箱选择框,点击所选邮箱后跳转至邮箱。

就是这么简单的需求。很简单,使用Intent.action就可以实现了。代码如下:

Intent intent=new Intent(android.content.Intent.ACTION_SEND);

intent.setType("text/plain");

startActivity(Intent.createChooser(intent,"分享一下"));

很简单的几行代码。但是一运行就发现不一样了。需求中 “点击所选邮箱后跳转至邮箱” 。但是这样做的结果是点击跳转的是写邮件的页面。不一样啊!

认真思考后,我认为一下的想法可能能够实现:

1、可能存在直接调用系统邮箱的方法。

2、获取邮箱的包名,通过邮件的包名打开邮箱。

第一种方法实在没有找到,默认为没有。如果哪位朋友知道,还请不吝赐教。

现在说第二种方法

Uri uri = Uri.parse("mailto:"+emailText);

List packageInfos = getPackageManager().queryIntentActivities(newIntent(Intent.ACTION_SENDTO, uri),0);

List packageList =newArrayList<>();

List emailIntents =newArrayList<>();

for(inti =0; i < packageInfos.size {

String packageName = packageInfos.get.activityInfo.packageName;

if(packageList.contains(packageName)) {

packageList.remove(packageName);

}

packageList.add(packageName);

}

for(inti =0; i < packageList.size {

Intent intent = getPackageManager().getLaunchIntentForPackage(packageList.get;

emailIntents.add;

}

Intent chooserIntent = Intent.createChooser(emailIntents.remove,"Select app!");

if(chooserIntent !=null) {

chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, emailIntents.toArray(newParcelable[]{}));

startActivity(chooserIntent);

}

再次尝试,成功啦!

URL Scheme是什么

android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。


小结

虽然是一个很小的功能,但是从这个小功能中,我们能够明白:当没有现成的可以使用时,我们应该思考,运用现有的方法去达到我们的目的!下一期我想和大家分享的是:方便高效仿IOS dialog。

>原文作者litterMay

>原文链接:

Map APP相关

目前市场上占有率比较高的地图主要有:百度,高德,谷歌(CN大陆暂时不能使用),腾讯

四大公司相关的API平台问题

百度地图:http://lbsyun.baidu.com/index.php?title=uri/api/android

高德地图:http://lbs.amap.com/api/uri-api/android-uri-explain/

腾讯地图:手机美高梅游戏网址 ,http://lbs.qq.com/uri_v1/index.html

谷歌地图:https://developers.google.com/maps/documentation/android-api/intents

在做更新app的时候因为7.0系统的手机没有配置,导致强制更新下载下来的时候,app没有自动安装,后来查资料才知道,原来是没有添加临时权限,所以今天在这记录一下.供后面参考

代码示例

检查是否安装

* 检查手机上是否安装了指定的软件

* @param context

* @param packageName:应用包名

* @return

*/

public static boolean isAvilible(Context context, String packageName){

//获取packagemanager

final PackageManager packageManager = context.getPackageManager();

//获取所有已安装程序的包信息

List packageInfos = packageManager.getInstalledPackages(0);

//用于存储所有已安装程序的包名

List packageNames = new ArrayList();

//从pinfo中将包名字逐一取出,压入pName list中

if(packageInfos != null){

for(int i = 0; i < packageInfos.size(); i++){

String packName = packageInfos.get(i).packageName;

packageNames.add(packName);

}}

//判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE

return packageNames.contains(packageName);

}

百度地图

if(isAvilible(context,"com.baidu.BaiduMap")){//传入指定应用包名

try {

//  intent = Intent.getIntent("intent://map/direction?origin=latlng:34.264642646862,108.95108518068|name:我家&destination=大雁塔&mode=driving®ion=西安&src=yourCompanyName|yourAppName#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");

intent = Intent.getIntent("intent://map/direction?" +

//"origin=latlng:"+"34.264642646862,108.95108518068&" +  //起点  此处不传值默认选择当前位置

"destination=latlng:"+location[0]+","+location[1]+"|name:我的目的地"+        //终点

"&mode=driving&" +          //导航路线方式

"region=北京" +          //

"&src=慧医#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");

context.startActivity(intent); //启动调用

} catch (URISyntaxException e) {

Log.e("intent", e.getMessage());

}

}else{

//未安装

//market为路径,id为包名

//显示手机上所有的market商店

Toast.makeText(context, "您尚未安装百度地图", Toast.LENGTH_LONG).show();

Uri uri = Uri.parse("market://details?id=com.baidu.BaiduMap");

intent = new Intent(Intent.ACTION_VIEW, uri);

context.startActivity(intent);

}

高德地图

if (isAvilible(context, "com.autonavi.minimap")) {

try{

intent = Intent.getIntent("androidamap://navi?sourceApplication=慧医&poiname=我的目的地&lat="+location[0]+"&lon="+location[1]+"&dev=0");

context.startActivity(intent);

} catch (URISyntaxException e)

{e.printStackTrace(); }

}else{

Toast.makeText(context, "您尚未安装高德地图", Toast.LENGTH_LONG).show();

Uri uri = Uri.parse("market://details?id=com.autonavi.minimap");

intent = new Intent(Intent.ACTION_VIEW, uri);

context.startActivity(intent);

}

谷歌地图:

if (isAvilible(context,"com.google.android.apps.maps")) {

Uri gmmIntentUri = Uri.parse("google.navigation:q="+location[0]+","+location[1] +", + Sydney +Australia");

Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);

mapIntent.setPackage("com.google.android.apps.maps");

context.startActivity(mapIntent);

}else {

Toast.makeText(context, "您尚未安装谷歌地图", Toast.LENGTH_LONG).show();

Uri uri = Uri.parse("market://details?id=com.google.android.apps.maps");

intent = new Intent(Intent.ACTION_VIEW, uri);

context.startActivity(intent);  }

腾讯地图

腾讯暂时不提供相关接口

首先需要再清单文件里注册一个provider 这个就是用来保存一个临时的uri,(可能我的理解是不对的,我是这么想的),7.0的这块主要就是uri和7.0之前不同,不能直接被使用,只能使用代理的形式来获得.

清单文件的内容

编辑:美高梅手机游戏网站 本文来源:现在的项目需要从自己的应用打开邮箱,在做更

关键词:

  • 上一篇:没有了
  • 下一篇:没有了