`
uule
  • 浏览: 6348719 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

《第一行代码》通知+接收拦截发送短信

 
阅读更多

 

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拦截陌生人号码短信

    在Android系统中,拦截陌生号码短信是通过使用BroadcastReceiver(广播接收器)这一核心组件来实现的。BroadcastReceiver允许应用程序监听并响应系统或应用程序广播事件,其中包括接收到短信的事件。接下来,我们将...

    安卓短信彩信相关相关-短信拦截应用程序源码学习研究用研究用别人安装激活后拦截全部短信在别人手机不显示短信。.rar

    当系统接收到新的短信时,会发送一个广播,我们的广播接收器可以监听这个广播并执行拦截逻辑。通过重写`onReceive()`方法,我们可以判断短信内容、发件人等信息,决定是否拦截这条短信。 接着,为了实现拦截功能,...

    Android接收和发送短信的实现代码

    第一个参数是接收者的电话号码,第二个参数是发送者的电话号码(如果为空,系统会使用设备默认号码),第三个参数是短信内容,第四和第五参数是发送状态回调的PendingIntent,可以省略。 3. **处理发送失败或成功*...

    在QQ通讯录之前拦截短信(android)

    在Android平台上,拦截短信是一项常见的功能,特别是在开发第三方安全应用或者自定义ROM时。这个话题主要涉及Android的BroadcastReceiver和IntentFilter,以及如何在QQ通讯录之前接收到短信广播。让我们深入探讨一下...

    联通短信网关SPMS鉴权中心错误代码

    当SP通过短信网关发送短信服务时,系统会检查各种参数以确保服务合法并符合规范。以下是针对错误代码的详细解释: 1. **错误代码201:业务代码未分配** 这个错误意味着在MT(Mobile Terminated,移动接收)话单中...

    电信设备-手机拒绝接收短信息的方法.zip

    例如,向特定的代码发送短信,或登录运营商网站进行个性化设置。 4. **飞行模式**:在不想接收任何消息的情况下,开启飞行模式是最直接的方法。不过这也会阻止所有电话和网络连接。 **iOS系统** 1. **阻止联系人*...

    短信彩信群发系统平台源码1.0版

    2、扩展扣量,扣量规则分为按比例扣量和最高发送短信数量,可针对每个客户设置不同的扣量规则 3、重新定义短信接口,准确获取短信接口余额,满足90%短信接口直接在后台配置就能使用。 4、通讯录管理,支持批量上传...

    短信接口下载

    通过这样的接口,企业或开发者可以实现自动化发送短信、接收短信以及与用户进行交互的能力。 短信接口通常由电信运营商或者第三方短信服务提供商提供,它们提供了一系列的编程接口,如HTTP RESTful API、SOAP、SMPP...

    Ecshop注册短信验证

    4. 异常处理:当短信发送失败时,应有备用方案,如切换其他短信通道或通知管理员。 综上所述, Ecshop注册短信验证是提升用户注册安全性和便捷性的重要功能。正确实现并优化这个功能,既能保护网站免受恶意攻击,又...

    sms短信管理

    【描述】:提到的博文链接指向了iteye博客上的一篇文章,虽然具体内容未给出,但我们可以推测它可能涵盖了短信服务的实现细节,如如何使用特定工具或自建系统来管理和发送短信。博主zzwwyf可能分享了关于短信服务器...

    android短信截取

    在短信截取的场景中,我们需要创建一个自定义的BroadcastReceiver,并在AndroidManifest.xml中注册,以便在接收到短信时触发我们的代码。 二、SMS权限 在Android中,读取和写入短信需要对应的权限。对于短信截取,...

    SmsRejectedReceiver.rar_Rejected

    1. **短信被系统拦截**:例如,当用户在设置中启用了“拦截所有短信”或者安装了第三方安全应用进行拦截。 2. **设备处于忙碌状态**:如通话中或屏幕锁定时,某些设备可能配置为不接收短信。 3. **存储空间不足**:...

    基于Android Broadcast的短信安全监听系统的设计和实现.pdf

    1. **广播监听**:实时监听系统中的所有短信相关广播,这包括短信的接收、发送、删除等事件。 2. **行为捕获**:当检测到与短信相关的广播时,系统会记录和分析广播内容,识别潜在的恶意行为。 3. **恶意行为识别**...

    android黑名单

    7. **通知与日志**:当拦截事件发生时,系统通常会记录日志,并可选择性地向用户发送通知,告知用户已成功拦截某个通信请求。 8. **隐私保护**:在处理用户数据时,尤其是涉及到通信记录,开发者必须遵守隐私政策,...

    vc++ 应用源码包_5

    Windows核心编程(第五版)随书源代码 vc-ftp 多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的...

    broadcastReceiver

    3. 获取发送短信的权限,通常需要在`AndroidManifest.xml`中添加`&lt;uses-permission android:name="android.permission.RECEIVE_SMS" /&gt;`。 4. 在`SmsReceiver`的`onReceive()`方法中,可以通过调用`abortBroadcast()...

    this is my SMSC document2

    7. **API接口**:现代SMSC可能提供API接口,允许第三方应用集成短信服务,例如验证码发送、企业通知等。这些接口通常基于HTTP、REST或SMPP协议。 8. **多语言支持**:对于全球化的移动通信,SMSC文档可能描述如何...

    传智播客的android开发源代码

    04_开发与运行(卸载)第一个ANDROID应用.avi 所在项目:Hello 06_电话拔号器.avi 所在项目:phone 08_短信发送器.avi 所在项目:sms 09_深入了解各种布局技术.avi 所在项目:sms & FrameLayout 10_对应用进行单元...

Global site tag (gtag.js) - Google Analytics