安卓多媒体应用

来源:互联网 发布:云计算演讲 编辑:程序博客网 时间:2024/04/28 23:09

一、使用通知

通知的作用

1.显示接收到短消息、即时消息等信息(如QQ、微信、新浪、短信)
2.显示客户端的推送消息(如有新版本发布,广告、推荐新闻)
3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)

通知的布局

Notification支持文字内容显示、震动、三色灯、铃声等多种提示形式,在默认情况下,Notification仅显示消息标题、消息内容、送达时间这3项内容,以下就是通知的基本布局。
通知的基本布局:

这里写图片描述
普通视图:
高度64dp
大视图的通知在展开前也显示为普通视图

元素:
1.标题 Title/Name
2.大图标 icon/Photo
3. 内容信息 MESSAGE
4. 小图标 Secondary icon
5.通知的时间 Timestamp,默认为系统发出通知的时间,也可通过setWhen()来设置
相关分析
状态通知栏主要涉及到2个类:Notification和NotificationManager
Notification为通知信息类、它里面对应了通知栏的各个属性
NotificationManager:是状态栏通知的管理类,负责发通知、清除通知等操作。
注意:NotificationManager是一个系统Service,所以必须通过getSystemService(NOTIFICATION_SERVICE);
实现系统默认的通知栏管理 :
第一步:获取状态通知栏管理:

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  

第二步:实例化通知栏构造器NotificationCompat.Builder:

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);  

第三步:对Builder进行配置:

mBuilder.setContentTitle("测试标题")//设置通知栏标题      .setContentText("测试内容") /<span style="font-family: Arial;">/设置通知栏显示内容</span>      .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图  //  .setNumber(number) //设置通知集合的数量      .setTicker("测试通知来啦") //通知首次出现在通知栏,带上升动画效果的      .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间      .setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级  //  .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消        .setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)      .setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合      //Notification.DEFAULT_ALL  Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission      .setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON

通过setContentIntent(PendingIntent intent)设置相应启动的组件
PendingIntent 的用法同样很简单,它主要提供了几个静态方法用于获取 PendingIntent 的
实例,可以根据需求来选择是使用 getActivity()方法、 getBroadcast()方法、还是 getService()
方法。这几个方法所接收的参数都是相同的,第一个参数依旧是 Context,不用多做解释。
第二个参数一般用不到,通常都是传入 0 即可。第三个参数是一个 Intent 对象,我们可以通
过这个对象构建出 PendingIntent 的“意图”。第四个参数用于确定 PendingIntent 的行为,有
FLAG_ONE_SHOT、 FLAG_NO_CREATE、 FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_CURRENT 这四种值可选

 PendingIntent getDefalutIntent(int flags){          Intent  intent = new Intent(this,NotificationActivity.class);        PendingIntent pendingIntent= PendingIntent.getActivity(this, 1, intent, flags);          return pendingIntent;   }

四、调用 NotificationManager 的 notify()方法就可以让通知显示
出来了。

   manager.notify(1, mBuilder.build());  //第一参数为id,保证每个通知的id不同,第二个参数为通知对象

运行效果

这里写图片描述
点击通知后
这里写图片描述

二、短信的接收、拦截、和发送

短信的接收采用了广播机制,当手机接收到一条短信的时候,系统会发出一条值为 android.provider.Telephony.SMS_RECEIVED 的广播,该广播携带短信的所有内容。每个应用都可以对它进行监听,收到广播时,从中解析出短信的相关内容就行。

接收短信

package com.example.smstest;import android.annotation.SuppressLint;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Build;import android.os.Bundle;import android.provider.Telephony;import android.provider.Telephony.Sms;import android.telephony.SmsMessage;import android.telephony.TelephonyManager;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {    private TextView sender;    private TextView content;    private IntentFilter receiveFilter;    private MessageReceiver messageReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sender = (TextView) findViewById(R.id.sender);        content = (TextView) findViewById(R.id.content);        receiveFilter = new IntentFilter();        receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");        messageReceiver = new MessageReceiver();        registerReceiver(messageReceiver, receiveFilter);    }    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(messageReceiver);    }    class MessageReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Log.v("SMS----", "onReceives0");            getSmsMessage2(context, intent);        }        @SuppressLint("NewApi")        public String getSmsMessage1(Context context, Intent intent) {            Bundle bundle = intent.getExtras();            SmsMessage smsMessage;            if (Build.VERSION.SDK_INT >= 19) { // KITKAT                SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);                smsMessage = msgs[0];            } else {                Object pdus[] = (Object[]) bundle.get("pdus");                smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]);            }            return "";        }        @SuppressLint("NewApi")        public String getSmsMessage2(Context context, Intent intent) {            Log.v("SMS----", "getSmsMessage2");            Bundle myBundle = intent.getExtras();            SmsMessage[] messages = null;            String strMessage = "";            if (myBundle != null) {                Log.v("SMS----", "getSmsMessage~");                Object[] pdus = (Object[]) myBundle.get("pdus");                messages = new SmsMessage[pdus.length];                for (int i = 0; i < messages.length; i++) {                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                        String format = myBundle.getString("format");                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);                    } else {                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);                    }                    strMessage+="index="+i;                    strMessage += "SMS From:" + messages[i].getOriginatingAddress();                    strMessage += " : ";                    strMessage += messages[i].getMessageBody();                    strMessage += "\n";                }                Log.v("SMS----", "getSmsMessage~2"+strMessage);                Log.v("SMS", strMessage);                Toast.makeText(context, strMessage, Toast.LENGTH_SHORT).show();            }            return "";        }    }}

需要给程序声明短信接收权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.smstest"android:versionCode="1"android:versionName="1.0" ><uses-permission android:name="android.permission.RECEIVE_SMS" />……</manifest>

短信的拦截

短信的拦截分两步:
一提高 MessageReceiver 的优先级,让它能够先
于系统短信程序接收到短信广播

receiveFilter.setPriority(100);

二、在 onReceive()方法中调用 abortBroadcast()方法,中止掉广播的继续传递。

abortBroadcast();

参考:
1.《安卓第一行代码》
2.博客

0 0
原创粉丝点击