安卓多媒体应用

一、使用通知

通知的作用

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.博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值