6.1、程序运行在手机上

6.2、使用通知

通知是Android中比较由特色的一个功能

当某个应用程序需要向用户发出一些提示信息时

而该程序由不在前台的显示

就可以借助通知来实现

6.2.1、通知的基本用法

通知既可以在活动中创建又可以在广播接收器中创建

步骤:

首先需要一个NotificationManager来对通知进行管理

可以调用Contexe大的getSystemService()方法获取到

getSystemService()方法接受一个字符串参数用于确定获取系统的哪一个服务

这里传入Context.NOTIFICATION_SERVICE即可

获取NotificationManager的梳理就可以写成:

NotificationManager manager = (NotificationManager)

  getSystemService(Context.NOTIFICATION_SERVICE);

其次使用一个Builder构造器来创建Notification对象

使用support库中提供的兼容API

support-4库中提供了一个Notification类

是哟个这个类构造器创建Notification对象

可以保证在所有的Android系统版本上都能使用

Notification notification = new NotificationCompat.Builder(content).build();

此时创建了一个空的Notification对象,并没有实际的作用

可以使用最终的build()方法之前连缀任意多的设置方法来创建一个丰富的Notification对象

Notification notification = new BotificationCompat.Builder(context)

  .setContentTittle("tittle")

  .setContentText("text")

  .setWhen(System.currentTimeMillis())

  .setSmallIcon(R.drawable,small,icon)

  .setLargeIcon(BitmapFactory.decodeResource(getResource(),

    R.drawable.larfe_icon))

  .build();

setContentTittle:用于指定指定通知标题的内容,下拉系统状态栏就可以看到这部分内容

setContentText:指定统治的正文的上下文

setWhen:指定通知被创建的时间

setSmallIcon:设置通知的小图标

setLargeIcon:设置通知的大图标,当系统下拉时能可以看到设置的大图标

最后:以上的工作都做完之后

只需要调用NotificationManager的notify()方法就可以让通知显示出来

两个参数:

1、id,保证每个统治的id都是不同的

2、Notification对象,这里直接将创建好的Notification对象传入即可

manager.notify(1,notification);

设置一按钮进行发送通知:

    <Button
android:text="发送通知"
android:id="@+id/send"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

在MianActivity中:

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NotificationManager manager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle")
.setContentText("msg")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.build();
manager.notify(1
,notification);
}
}); }
}

ff.png:

send.png

点击按钮之后

通知栏中会进行发送通知

此时的这个是没有点击效果的

也没有反应

如果要实现点击的设置

需要涉及到:PendingIntent

PendingInternet的用法:

提供了几个静态方法用于获取PendingInternet的实例

可以根据选择使用getActivity()方法

getBroadcast()方法、getService()方法

这几个方法的参数都是相同的

1、content

2、一般传入0

3、Intent对象,可以通过这个对象构建出pendingInternet

4、用于确定PendingInternet的行为

  FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT、FLAG_UPDATE_CURRENT

  通常情况下传入0

NotificationCompat.Buolder这个构造器中还可以连缀一个setContentIntent()方法

接受的参数十一和PPendingIntent对象

这里就可以通过构造出的一个延迟执行的意图

当用户点击时就可以跳转到该逻辑

此时新建一个活动:

    <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="已经跳转到第二个页面"/>

在哦MianActivity中:

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"send",Toast.LENGTH_LONG).show();
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
PendingIntent pendingIntent
= PendingIntent.getActivity(MainActivity.this,0,intent,0); NotificationManager manager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle")
.setContentText("msg")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.setContentIntent(pendingIntent)
.build();
manager.notify(,notification);
}
});
}
}

此时点击通知之后直接跳转到新建的页面

移除通知:

此时点击之后的通知依然还在通知栏并没有消失

此时突然让其消失的方法由:

 Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle")
.setContentText("msg")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();
manager.notify(,notification);

使用setAuticancel()方法闯入true:表示点击这个统治的时候通知会自动去小品

6.2.2、通知的进阶技巧

NotificationCompat.Builder中提供了非常丰富的API来创建通知

对API中的一些常用的额方法进行学习

1、setSound()方法可以在接收通知的时候发送一段音频

能够更好的告知用户通知的到来

接收一个Uri参数

所以在指定音频文件的时候还需要首先获取到音频文件对应的Uri

手机/system/media/audio/ringtones目录下就有很多的音频文件

2、setvibrate()方法在接收通知的时候让手机震动

参数是一个数组,用于设置手机震动的时长

以毫秒为单位

想要手机震动还需要申请权限:

                Intent intent = new Intent(MainActivity.this,Main2Activity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,,intent,); NotificationManager manager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel();
Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle")
.setContentText("msg")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.setContentIntent(pendingIntent)
.setVibrate(new long[]{0,2000,1000,1000})
.setSound(Uri.fromFile(new File("/netease/cloudmusic/Music/dd.mp3"))) .build();
manager.notify(,notification);
}

关于LED等的设置

一般手机设置的都有Led等

setLights()接收三个参数

1、LED灯的颜色

2、指定LED灯亮的时长

3、执行LED等暗去的时长

毫秒为单位

                Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle")
.setContentText("msg")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.setContentIntent(pendingIntent)
.setVibrate(new long[]{,,,})
.setSound(Uri.fromFile(new File("/netease/cloudmusic/Music/dd.mp3")))
.setLights(Color.RED,1000,1000)
.build();

6.2.3、通知的高级功能

NotificationCompat.Builder类中

1、setStyle()方法,允许构建出富文本通知内容

也就是说通知中通知中不仅可以文字和图片还可以有其他的通知效果

接收一个NotificationCompat.Style的参数这个参数即使用来构建富文本信息的如文字、图片等

当文字内容较多的时候会使用...来代替

使用:setStyle(new NotificationCompat.BigTextStyle().bigText()

       Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle") .setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.setContentIntent(pendingIntent)
.setVibrate(new long[]{,,,})
.setLights(Color.RED,,)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setStyle(new NotificationCompat.BigTextStyle().bigText("你说你会永远爱我,爱情这东西我明白,可永远是什么呢?他问我喜欢你哪里,我想了想说,我喜欢你走路的样子。他问我喜欢你哪里,我想了想说,我喜欢你走路的样子。"))
.build();

同时还可以设置图片进行方法:new NotificationCompat.BigPictureStyle().bigPicture()

                Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle") .setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.setContentIntent(pendingIntent)
.setVibrate(new long[]{,,,})
.setLights(Color.RED,,)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setStyle(new NotificationCompat.BigTextStyle().bigText("你说你会永远爱我,爱情这东西我明白,可永远是什么呢?他问我喜欢你哪里,我想了想说,我喜欢你走路的样子。他问我喜欢你哪里,我想了想说,我喜欢你走路的样子。"))
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.ff)) )
.build();

2、setProiority()设置统治的重要程度

接受一个整形的参数用于设置这条统治的重要程度

1、PRIORITY_DEFAULT默认重要程度

2、PRIORITY_MIN最低的重要程度,可能在特定的常豪才能进行显示该通知

3、PRIORITY_LOW较低的重要程度

系统可能将这类通知缩小或者显示在其中中国要通知之后

4、PRIORITY_HIGH表示较高的程度

系统可能将这类通知方法

5、PRIORITY_MAX最高成都的通知

这类通知消息必须要用户立刻看到

         Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("tittle")
.setContentText("你说你会永远爱我,爱情这东西我明白,可永远是什么呢?他问我喜欢你哪里,我想了想说,我喜欢你走路的样子。他问我喜欢你哪里,我想了想说,我喜欢你走路的样子。")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.send)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ff))
.setContentIntent(pendingIntent)
.setVibrate(new long[]{,,,})
.setLights(Color.RED,,)
.setPriority(NotificationCompat.PRIORITY_MAX)
.build();

6.3、调用摄像头和相册

如现在社交软件可以使用摄像头拍摄进行上传等

按钮用于前去相机页面

ImageView用于显示拍照之后的图片

    <Button
android:id="@+id/take_photo"
android:text="take photo"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/photo"
android:layout_gravity="center_horizontal"/>

MainActivity中

public class MainActivity extends AppCompatActivity {
private Uri imageUri;
private ImageView picture;
public static final int TAKE_PHOTO = ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button take_photo = (Button) findViewById(R.id.take_photo);
picture = (ImageView) findViewById(R.id.photo);
take_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File outputImage = new File(getExternalCacheDir(),"output_image.jpg"); try {
if (outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
}catch (Exception e){
e.printStackTrace();
} if (Build.VERSION.SDK_INT >=){
imageUri = FileProvider.getUriForFile(MainActivity.this,"com.example.cameraalbumtest",outputImage);
}else {
imageUri = Uri.fromFile(outputImage);
}
//启动相机
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
}); } @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if (resultCode == RESULT_OK){
try {
//显示照片
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
}catch (Exception e){
e.printStackTrace();
}
}
break;
default:
}
}
}

首先是对控件进行绑定,按钮实现点击事件的监听

点击事件的逻辑:

1、创建一个File对象,用于存放摄像头拍下的图片,并且把图片命名为output_image.jpg

  并将照片存放在手机SD卡的应用关联目录

  关联目录:指SD卡中专门用于存放当前应用缓存的数据,

        使用getExternalCacheDir()方法可以得到这个目录

        具体的路径是:/sdcard/Android/data<package name>/cache

        Android6.0之后SD卡被列为危险权限,如果将图片存放在SD卡任何目录

        都要进行运行时权限处理才行,使用关联目录可以跳过这一步

2、判断,  if (Build.VERSION.SDK_INT >=24)

   如果运行设备版本系统低于7.0,就调用Uri的fromFile()方法将File对象转换为Uri对象

   这个Uri对象标识着output_image.jpg这张图片的真实路径

   否则,就调用FileProvider的getUriForFile()方法将File对象转为一个封装过的Uri

   getUriForFile()方法接收三个参数:

   1、content对象

   2、任意唯一的字符串

   3、刚刚创建的File对象

   Android7.0开始,直接使用本地真实路径的Uri是认为是不安全的,会抛出一个FilrUriException以尝

   而FileProvider是一个特殊的内容提供器,使用和内容提供器类似的机制对数据进行保护

   可以选择性的将封装过的Uri共享给外部,从而提高应用的安全性

3、创建一个Intent对象,并将这个Intent的action指定为android.media.action.IMAGE_CAPTURE

    在调用Intent的putExtra()方法指定图片的输出地址,填入Uri对象

  最后调用startActivityForResult()方法启动活动

  传递的是一个隐式的Intent,系统能够相应这个Intent的活动启动,这样照相机就被打开了

使用的是startActivityForResult()启动活动,拍完照之后会有结果返回到onActivityResult()中

如果发现拍照成功就调用BitmapFactory的decodeStream()方法将output_image.jsp

这张图片解析成Bitmap对象

最后将他设置到ImageView中

中进行注册

  ......
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.cameraalbumtest"

android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>

android:name属性值是固定的

android:authorities属性的指必须和刚刚FileProvider.getUriForFile()方法中的第二个参数一致

使用meta-data标签指定Uri的共享路径

并且引用 一个@xml/file_paths资源

file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path=""></external-path> </paths>

external-path就是用来指定uri共享的,name值任意取值

path属性的值代表共享的具体路径

这里设置空值表示将整个SD卡进行共享,当然可以共享存放图片资源的路径

在Android4.4之前访问SD看的应用关联目录也是要声明权限的

4.4以后的系统不在需要声明权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

6.3.2、从相册中选择照片

6、Android---运用手机多媒体(待完成)的更多相关文章

  1. Android之手机向导以及设置中心模块的开发

    当我们使用的新的软件的时候,我们首先需要教用户如何使用我们的软件,当用户学习完使用教程,下次再登录的时候,我们应该直接跳到我们的功能界面,下面我来展示一下我学习视频做的效果图:手机防盗这个功能模块就是 ...

  2. Android使得手机拍照功能的发展(源共享)

    Android系统调用手机拍照功能有两种方法来直接调用手机自带摄像头还有一个就是要当心自己的节拍. 例Camera360 强大的一个在每个操作系统都有一个手机摄影软件:您可以捕捉不同风格,不同特效的照 ...

  3. Android 个人手机通讯录开发

    一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示                2. ...

  4. RomUtil【Android判断手机ROM,用于判断手机机型】

    参考资料 Android判断手机ROM 正文 有时候需要判断手机系统的ROM,检测ROM是MIUI.EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件查找是否有对应属性 ...

  5. Android/IOS手机使用Fiddler抓包

    对于Android和IOS开发及测试的同事来说抓包是一个很重要的事,有利于排查问题所在,快速定位问题.但长期以来一直没有一款可以快速抓包的工具,直到有了Fiddler2. 使用步骤: 1.  Fidd ...

  6. Android 判定手机是否root

    Android获取手机root的状态 package com.app.demo; import java.io.File; import android.app.Activity; import an ...

  7. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

  8. 十问Android NFC手机上的卡模拟(转)

    1,  问:能否在AndroidNFC手机上实现卡模拟? 答:在技术上可行,但是,对一般开发人员来讲,目前看来仅仅是技术上可行:( 2,  问:具体如何实现呢? 答:有两种方式:一种是基于硬件的,被称 ...

  9. Android获取手机分辨率DisplayMetircs类

    关于Android中手机分辨率的使用 Android 可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题. 手机的分辨率信息是手机的 ...

  10. Android安卓手机游戏开发

    成都传智播客Java培训,免费学Android安卓手机游戏开发,安卓android开发课程包括Android安卓应用开发和Android安卓游戏开发两个方向,可是偏向游戏开发. 依据"199 ...

随机推荐

  1. jvm 内存机制

    jvm 的内存包括stack ,Heap,NonHeap,在此重点说明Heap,NonHeap. Heap叫堆内存,它用于存放类实例和数组信息.NonHeap叫非堆内存,用于存放类,方法等可反射的对象 ...

  2. 关于VUE中 import 、 export 和 export default 的注意问题

    1.import引入一个依赖包,不需要相对路径.import 引入一个自己写的js文件,是需要相对路径的. 示例:import axios from ‘axios’; import AppServic ...

  3. css实现修改默认滚动条样式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head&g ...

  4. Working C# code for MySql5.5 Stored Procedures IN parameters

    MySQL5.5存储过程: #插入一条 涂聚文 DELIMITER $$ DROP PROCEDURE IF EXISTS `geovindu`.`proc_Insert_BookKindList` ...

  5. UOJ42. 【清华集训2014】Sum

    传送门 Sol \((-1)^a=1-2(a~mod~2)=1-2a+4\lfloor\frac{a}{2}\rfloor\) 那么原式变成 \(n-2\sum_{i=1}^{n}\lfloor d\ ...

  6. 收藏的几个关于php面向对象教程

    面向对象的分析方法是利用面向对象的信息建模概念,如实体.关系.属性等,同时运用封装.继承.多态等机制来构造模拟现实系统的方法,学会了面向对象思想,能够大大提高php编程开发效率!本篇文章php中文网将 ...

  7. AJAX 概念 优势 发展前景 工作原理 底层技术 状态 缺点 框架

    1. 概念 Ajax asynchronous JavaScript and XML , 异步js和xml. 这种解释已经过时了, 现在ajax就是, 允许浏览器和服务器通信, 而无需刷新当前页面的技 ...

  8. react项目 路径优化

  9. 【转】fatal error C1189: #error : missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS

    转自:http://blog.csdn.net/friendan/article/details/46576699 fatal error C1189: #error :  missing -D__S ...

  10. 【Yii系列】Yii2.0的安装与调试

    接上一节的话,我们最终选择了Yii框架作为我们的主要开发框架,今天,我就和大伙来聊聊如何安装与调试Yii2.0,以及后续会和大伙聊聊如何在Yii2.0上快速撸代码. Yii2.0的安装 好的,Comp ...