安卓学习 之 多媒体技术(八)

一、通知

  1. 需要NotificationManager对通知进行管理,getSystemService获取系统中的那个服务。
NotificationManager manager = 
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
  1. 用support-v4库提供的NotificationCompat类来创建Notification对象,确保了兼容性。

  2. 创建一个丰富的Notification对象,setContentTitle设置标题,setContentText设置内容,setWhen用于指定通知被创建的时间。使用Build方法进行生成。

Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.build();
  1. 使用notify方法将通知显示出来,notify()有两个参数,一个是id,一个是刚才创建的notification对象。
manager.notify(1, notification);
  1. 现在的notify可以显示出来,但是不能相应点击事件。我们现在让他点击后进入NotificationActivity活动中。

先构建Intent对象,pendingIntent式延迟执行的Intent,根须需求选择是使用getActivity还是getService。

Intent intent = new Intent(this,NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);

第一个参数是context,第二和第四个参数通常传入0就可以了。

  1. 在NotificationCompat.Builder中调用setContentIntent(pi)传入即可。
  2. 通知图标在产生点击事件时不会消失,要使其消失,有两种方法:
  • 要在NotificationActivity中添加
NotificationManager manager = (NotificationManager) 
getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1);
  • 或者NotificationCompat.Builder调用setAutoCancel(true)

通知的高级用法

  1. 允许播放音频。
Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/ Basic_tone.ogg"));
notification.sound = soundUri;
  1. 震动。
//下标为0的值表示手机静止的时长,下标为1的值表示手机振动的时长,下标为2的值又表示手机静止的时长,以此类推。
setVibrate(new long[]{0,1000,1000,1000}).build();
notification.vibrate = vibrates;
  1. LED灯
// LED 灯以绿色的灯光一闪一闪的效果
notification.ledARGB = Color.GREEN; 
notification.ledOnMS = 1000;
notification.ledOffMS = 1000;
notification.flags = 
Notification.FLAG_SHOW_LIGHTS;

二、短信

接收短信

  1. 定义一个接受者。
class MessageReceiver extends BroadcastReceiver { 
    @Override
    public void onReceive(Context context, Intent intent) { 
        Bundle bundle = intent.getExtras();
        Object[] pdus = (Object[]) bundle.get("pdus"); // 提取短信消息
        SmsMessage[] messages = new SmsMessage[pdus.length]; 
        for (int i = 0; i < messages.length; i++) {
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        }
        String address = messages[0].getOriginatingAddress(); // 获取发送方号码
        String fullMessage = "";
        for (SmsMessage message : messages) {
            fullMessage += message.getMessageBody(); // 获取短信内容
        }
        sender.setText(address); content.setText(fullMessage);
    }
}

我们从 Intent 参数中取出了一个 Bundle 对象,然后使用 pdu **来提取一个 SMS pdus 数组, 其中每一个 pdu 都表示一条短信消息。接着使用 SmsMessage 的
createFromPdu() 方法将每一个 pdu 字节数组转换为 SmsMessage 对象, 调用这个对象的
getOriginatingAddress()方法就可以获取到短信的发送方号码,调用 getMessageBody()方法就可以获取到短信的内容,然后将每一个 SmsMessage 对象中的短信内容拼接起来,就组成了一条完整的短信。

  1. 在活动中的oncreate方法中绑定 事件 与 内容接受者。
receiveFilter = new IntentFilter();
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
messageReceiver = new MessageReceiver(); 
registerReceiver(messageReceiver, receiveFilter);

接收短信

  1. 得到SmsManager实例,直接调用sendextMessage方法。
SmsManager smsManager = SmsManager.getDefault(); 
smsManager.sendTextMessage(to.getText().toString(),
null,msgInput.getText().toString(), null, null);

sendTextMessage()方法接收五个参数,其中第一个参数用于指定接收人的手 机号码,第三个参数用于指定短信的内容

  1. 类似通知,想要在发送短信之后知道短信的状态,怎么办呢?
sendFilter = new IntentFilter(); 
sendFilter.addAction("SENT_SMS_ACTION"); 
sendStatusReceiver = new SendStatusReceiver(); 
registerReceiver(sendStatusReceiver, sendFilter); 

send.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        SmsManager smsManager = 
        SmsManager.getDefault(); 
        Intent sentIntent = new Intent("SENT_SMS_ACTION");
        PendingIntent pi = PendingIntent.getBroadcast (MainActivity.this, 0, sentIntent, 0);
        smsManager.sendTextMessage(to.getText().toString(), null,msgInput.getText().toString(), pi, null);
    }
});


class SendStatusReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (getResultCode() == RESULT_OK) {
            // 短信发送成功
            Toast.makeText(context, "Send succeeded",   Toast.LENGTH_LONG).show();
        } else {
            // 短信发送失败
            Toast.makeText(context, "Send failed", Toast.LENGTH_LONG).show();
        }
    }
}
  • 获取到了一个 PendingIntent 对象,并将它作为第四个参数传递到 sendTextMessage()方法中
  • PendingIntent 发出 SENT_SMS_ACTION 这样的一个事件
  • 新建一个事件接受者SendStatusReceiver,绑定该接受者 和 SENT_SMS_ACTION 事件。

三、摄像头和相册

  1. 定义输出图片的路径
  2. 启动相机程序的Intent
  3. 启动相机并拍照
  4. 进入onActivityResult,启动截图的Intent
  5. 截图成功
  6. 把图片显示出来

安卓学习 之 多媒体技术(八)

四、多媒体文件

音频

方法名 功能描述
setDataSource() 设置要播放的音频文件的位置。
prepare() 在开始播放之前调用这个方法完成准备工作。
start() 开始或继续播放音频。
pause() 暂停播放音频。
reset() 将 MediaPlayer 对象重置到刚刚创建的状态。
seekTo() 从指定的位置开始播放音频。
stop() 停止播放音频。调用这个方法后的 MediaPlayer 对象无法再播放音频。
release() 释放掉与 MediaPlayer 对象相关的资源。
isPlaying() 判断当前 MediaPlayer 是否正在播放音频。
getDuration() 获取载入的音频文件的时长。

首先需要创建出一个MediaPlayer 对象,然后调用 setDataSource()方法来设置音频文件的路径,再调用 prepare()方法使MediaPlayer 进入到准备状态,接下来调用start()方法就可以开始播放音频,调用pause() 方法就会暂停播放,调用 reset()方法就会停止播放。

视频

方法名 功能描述
setVideoPath() 设置要播放的视频文件的位置。
start() 开始或继续播放视频。
pause() 暂停播放视频。
resume() 将视频重头开始播放。
seekTo() 从指定的位置开始播放视频。
isPlaying() 判断当前是否正在播放视频。
getDuration() 获取载入的视频文件的时长。