13、通知
在活动里创建通知的场景还是比较少的,因为一般只有当程序进入到后台的时候我们才需要使用通知
getSystemService()方法接收一个字符串参数用于确定获取系统的 哪个 服务
Notification 的有参构造函数接收三个参数,
第一个参数用于指定通知的图标
第二个参数用于指定通知的 ticker 内容,当通知刚被创建的时候,它会在系统的状态栏一闪而过,属于一种瞬时的提示信息。
第三个参数用于指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。
Notification 的 setLatestEventInfo()方法就可以给通知设置一个标准的布局。
这个方法接收四个参数,第一个参数是 Context。
第二个参数用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。
第三个参数用于指定通知的正文内容,同样下拉系统状态栏就可以看到这部分内容。
第四个参数我们暂时还用不到,可以先传入 null
notify()方法接收两个参数,第一个参数是 id,要保证为每个通知所指定的 id 都是不同的。
老写法:
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher, "This is ticker text", System.currentTimeMillis()); notification.setLatestEventInfo(this, "This is content title","This is content text", null); manager.notify(1, notification);
新写法:
Notification.Builder builder1 = new Notification.Builder(MainActivity.this); builder1.setSmallIcon(R.drawable.advise2); //设置图标 builder1.setTicker("显示第二个通知"); builder1.setContentTitle("通知"); //设置标题 builder1.setContentText("点击查看详细内容"); //消息内容 builder1.setWhen(System.currentTimeMillis()); //发送时间 builder1.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,灯光 builder1.setAutoCancel(true);//打开程序后图标消失 //跳转 Intent intent =new Intent (MainActivity.this,NotificationActivity.class); PendingIntent pendingIntent =PendingIntent.getActivity(MainActivity.this, 0, intent, 0); builder1.setContentIntent(pendingIntent); Notification notification1 = builder1.build(); notificationManager.notify(124, notification1); // 通过通知管理器发送通知
Intent 更加倾向于去立即执行某个动作,而 PendingIntent 更加倾向于在某个合适的时机去执行某个动作。所以,也可以把 PendingIntent 简单地理解为延迟执行的 Intent。
可以根据需求来选择是使用 getActivity()方法、getBroadcast()方法、还是 getService()方法。
第一个参数依旧是 Context。第二个参数一般用不到,通常都是传入 0 即可。第三个参数是一个 Intent 对象,我们可以通过这个对象构建出 PendingIntent 的“意图”。第四个参数用于确定 PendingIntent 的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_CURRENT 这四种值可选
取消通知:
接收通知活动NotificationActivity onCreate()中:
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); manager.cancel(124);
setLatestEventInfo方法不存在:
低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。
notification.setLatestEventInfo(context, title, message, pendingIntent);
高于API Level 11,低于API Level 16 (Android 4.1.2)版本的系统中,可使用Notification.Builder来构造函数。但要使用getNotification()来使notification实现。此时,前面版本在notification中设置的Flags,icon等属性都已经无效,要在builder里面设置。
Notification.Builder builder = new Notification.Builder(context) .setAutoCancel(true) .setContentTitle("title") .setContentText("describe") .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.ic_launcher) .setWhen(System.currentTimeMillis()) .setOngoing(true); notification=builder.getNotification();
高于API Level 16的版本,就可以用Builder和build()函数来配套的方便使用notification了。
Notification notification = new Notification.Builder(context) .setAutoCancel(true) .setContentTitle("title") .setContentText("describe") .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.ic_launcher) .setWhen(System.currentTimeMillis()) .build();
【接收短信】
声明权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
当手机接收到一条短信的时候,系统会发出一条值为
android.provider.Telephony.SMS_RECEIVED 的广播,这条广播里携带着与短信相关的所有
数据。每个应用程序都可以在广播接收器里对它进行监听,收到广播时再从中解析出短信的内容即可
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); } } //MainActivity中动态注册接收器广播: receiveFilter = new IntentFilter(); receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); messageReceiver = new MessageReceiver(); registerReceiver(messageReceiver, receiveFilter); protected void onDestroy() { super.onDestroy(); unregisterReceiver(messageReceiver); }
拦截短信:
你会发现在系统状态栏出现了一个通知图标,这个通知图标是由 Android自带的短信程序产生的。也就是说当短信到来时,不仅我们的程序会接收到这条短信,系统的短信程序同样也会收到。同样一条短信被重复接收两遍就会造成比较差的用户体验
系统发出的短信广播正是一条有序广播,所以可以拦截。
步骤:
一是提高 MessageReceiver 的优先级,让它能够先于系统短信程序接收到短信广播。
二是在 onReceive()方法中调用 abortBroadcast()方法
发送短信:
发送短信也是需要声明权限的
<uses-permission android:name="android.permission. SEND_SMS" />
法1:
万能的intent能够帮我们做很多事,只要你有“意图”它就会满足你。
private void sendMessageViaSystem() { Uri uri = Uri.parse("smsto:"+etNumber.getText()); Intent intent = new Intent(Intent.ACTION_VIEW,uri); intent.putExtra("sms_body",etMessage.getText().toString()); //intent.setType("rnd"); startActivity(intent); }
法2:
SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), null, null); //sendTextMessage()方法接收五个参数, public void sendTextMessage( String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
其中第一个参数用于指定接收人的手机号码,
第三个参数用于指定短信的内容
第四个参数来对短信的发送状态进行监控
后两个参数是PendingIntent,我们要监听发送状态就要用到这两个参数。与这个两个PendingIntent联系的是两个Broadcast Receiver
发送后提示发送成功:
1、动态注册 sendFilter = new IntentFilter(); sendFilter.addAction("SENT_SMS_ACTION"); sendStatusReceiver = new SendStatusReceiver(); registerReceiver(sendStatusReceiver, sendFilter); 2、发送短信 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); 3、广播接收器 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(); } } }
发送接收短信示例:
https://blog.csdn.net/lincyang/article/details/47686693
http://www.androidchina.net/3316.html
调用摄像头拍照
点击按钮后拍照,然后拍完后调用剪裁,剪裁完成后放入按钮下图片控件中。
调 用 Environment 的getExternalStorageDirectory()方法获取到的就是手机 SD 卡的根目录
涉及到了向 SD卡中写数据的操作,需要声明权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); takePhoto = (Button) findViewById(R.id.take_photo); picture = (ImageView) findViewById(R.id.picture); takePhoto.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 创建File对象,用于存储拍照后的图片 File outputImage = new File(Environment.getExternalStorageDirectory(), "tempImage.jpg"); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } //调用摄像头拍照 //将 File 对象转换成 Uri 对象,这个 Uri 对象标识着 output_image.jpg 这张图片的唯一地址 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) { //这个 Intent 是用于对拍出的照片进行裁剪 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(imageUri, "image/*"); intent.putExtra("scale", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // 启动裁剪程序 startActivityForResult(intent, CROP_PHOTO); } break; case CROP_PHOTO: if (resultCode == RESULT_OK) { try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); picture.setImageBitmap(bitmap); // 将裁剪后的照片显示出来 } catch (FileNotFoundException e) { e.printStackTrace(); } } break; default: break; } }
从相册选取照片剪裁:
chooseFromAlbum.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 创建File对象,用于存储选择的照片 File outputImage = new File(Environment.getExternalStorageDirectory(), "output_image.jpg"); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } // 上面跟调用摄像头一样 // 选取照片 imageUri = Uri.fromFile(outputImage); Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); intent.putExtra("crop", true); intent.putExtra("scale", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, CROP_PHOTO); } });
播放音频、视频
相关推荐
开发者可以使用`getDefault()`方法获取`SmsManager`实例,然后调用其方法如`sendTextMessage()`发送短信,或者注册监听器来接收短信。 2. **BroadcastReceiver**: 短信拦截的核心是创建一个自定义的...
在Android系统中,拦截陌生号码短信是通过使用BroadcastReceiver(广播接收器)这一核心组件来实现的。BroadcastReceiver允许应用程序监听并响应系统或应用程序广播事件,其中包括接收到短信的事件。接下来,我们将...
当系统接收到新的短信时,会发送一个广播,我们的广播接收器可以监听这个广播并执行拦截逻辑。通过重写`onReceive()`方法,我们可以判断短信内容、发件人等信息,决定是否拦截这条短信。 接着,为了实现拦截功能,...
第一个参数是接收者的电话号码,第二个参数是发送者的电话号码(如果为空,系统会使用设备默认号码),第三个参数是短信内容,第四和第五参数是发送状态回调的PendingIntent,可以省略。 3. **处理发送失败或成功*...
在Android平台上,拦截短信是一项常见的功能,特别是在开发第三方安全应用或者自定义ROM时。这个话题主要涉及Android的BroadcastReceiver和IntentFilter,以及如何在QQ通讯录之前接收到短信广播。让我们深入探讨一下...
当SP通过短信网关发送短信服务时,系统会检查各种参数以确保服务合法并符合规范。以下是针对错误代码的详细解释: 1. **错误代码201:业务代码未分配** 这个错误意味着在MT(Mobile Terminated,移动接收)话单中...
例如,向特定的代码发送短信,或登录运营商网站进行个性化设置。 4. **飞行模式**:在不想接收任何消息的情况下,开启飞行模式是最直接的方法。不过这也会阻止所有电话和网络连接。 **iOS系统** 1. **阻止联系人*...
2、扩展扣量,扣量规则分为按比例扣量和最高发送短信数量,可针对每个客户设置不同的扣量规则 3、重新定义短信接口,准确获取短信接口余额,满足90%短信接口直接在后台配置就能使用。 4、通讯录管理,支持批量上传...
通过这样的接口,企业或开发者可以实现自动化发送短信、接收短信以及与用户进行交互的能力。 短信接口通常由电信运营商或者第三方短信服务提供商提供,它们提供了一系列的编程接口,如HTTP RESTful API、SOAP、SMPP...
4. 异常处理:当短信发送失败时,应有备用方案,如切换其他短信通道或通知管理员。 综上所述, Ecshop注册短信验证是提升用户注册安全性和便捷性的重要功能。正确实现并优化这个功能,既能保护网站免受恶意攻击,又...
【描述】:提到的博文链接指向了iteye博客上的一篇文章,虽然具体内容未给出,但我们可以推测它可能涵盖了短信服务的实现细节,如如何使用特定工具或自建系统来管理和发送短信。博主zzwwyf可能分享了关于短信服务器...
在短信截取的场景中,我们需要创建一个自定义的BroadcastReceiver,并在AndroidManifest.xml中注册,以便在接收到短信时触发我们的代码。 二、SMS权限 在Android中,读取和写入短信需要对应的权限。对于短信截取,...
1. **短信被系统拦截**:例如,当用户在设置中启用了“拦截所有短信”或者安装了第三方安全应用进行拦截。 2. **设备处于忙碌状态**:如通话中或屏幕锁定时,某些设备可能配置为不接收短信。 3. **存储空间不足**:...
1. **广播监听**:实时监听系统中的所有短信相关广播,这包括短信的接收、发送、删除等事件。 2. **行为捕获**:当检测到与短信相关的广播时,系统会记录和分析广播内容,识别潜在的恶意行为。 3. **恶意行为识别**...
7. **通知与日志**:当拦截事件发生时,系统通常会记录日志,并可选择性地向用户发送通知,告知用户已成功拦截某个通信请求。 8. **隐私保护**:在处理用户数据时,尤其是涉及到通信记录,开发者必须遵守隐私政策,...
Windows核心编程(第五版)随书源代码 vc-ftp 多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的...
3. 获取发送短信的权限,通常需要在`AndroidManifest.xml`中添加`<uses-permission android:name="android.permission.RECEIVE_SMS" />`。 4. 在`SmsReceiver`的`onReceive()`方法中,可以通过调用`abortBroadcast()...
7. **API接口**:现代SMSC可能提供API接口,允许第三方应用集成短信服务,例如验证码发送、企业通知等。这些接口通常基于HTTP、REST或SMPP协议。 8. **多语言支持**:对于全球化的移动通信,SMSC文档可能描述如何...
04_开发与运行(卸载)第一个ANDROID应用.avi 所在项目:Hello 06_电话拔号器.avi 所在项目:phone 08_短信发送器.avi 所在项目:sms 09_深入了解各种布局技术.avi 所在项目:sms & FrameLayout 10_对应用进行单元...