第一行代码-运用手机多媒体总结(上)

通知

基本用法

三种创建方式:1、活动里创建 2、广播接收器里创建 3、服务里创建

创建步骤:

第一步:构造一个通知管理器对象

NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

第二步:创建一个丰富的Notification对象

Notification notification=new NotificationCompat.Builder(context)
	.setContentTitle("This is content title")//标题
	.setContentText("This is content text")//内容
	.setWhen(System.currentTimeMillis())//创建时间
	.setSmallIcon(R.drawable.small_icon)//通知小图标
	.setLargeIcon(BitmapFactory.decodeResource(getResources(),
		R.drawable.large_icon)//下拉后显示的图标
	.build();//创建

第三步:显示通知

//第一个参数是通知的ID,每个通知的ID都是不同的
//第二个参数就是刚刚创建的通知对象
manager.notify(1,notification);

PendingIntent

intent倾向于立即执行,而PendingIntent倾向于在合适时机执行

示例:用户点击通知后跳转到别的活动

Intent intent=new Intent(this,NotificationActivity.class);
PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification=new NotificationCompat.Builder(context)
	...
	.setContentIntent(pi);//给通知加入PendingIntent
	.build();
manager.notify(1,notification);

用户点击通知后让通知消失(两种方法):

Notification notification=new NotificationCompat.Builder(context)
	...
	.setAutoCancel(true)//用户点击通知后通知即消失
	.build();

通知的进阶技巧

Notification notification=new NotificationCompat.Builder(context)	
	...
	//设置通知提示音
	.setSound(Uri.fromFile("/system/media/audio/ringtones/文件")
	//设置振动,第一个参数表示静止时长,第二个参数表示振动时长,以此类推
	.setVibrate(new long[]{0,1000,1000,1000})
	//设置LED灯闪烁,第一个参数表示颜色,第二个参数表示亮起时长
	//第三个参数表示暗去时长
	.setLights(Color.GREEN,1000,1000)
	//设置默认通知效果
	.setDefaults(Notification.DEFAULT_ALL)
	.build();

注意,设置振动需要声明权限:

<uses-permission android:name="android.permission.VIBRATE"/>

通知的高级功能

Notification notification=new NotificationCompat.Builder(context) 
	...
	//显示长文本
	.setStyle(new NotificationCompat.BigTextStyle().bigText("长文本内容")//显示大图片
	.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(Bitmap
	-Factory.decodeResource(getResources(),R.drawable.big_image)))
	//设置优先级
	setPriority(NotificationCompat.PRIORITY_MAX)
	.build();

调用摄像头拍照并从相册里选择照片

// 创建File对象,用于存储拍照后的图片
                File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (Build.VERSION.SDK_INT < 24) {
                    imageUri = Uri.fromFile(outputImage);
                } else {
                    imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbumtest.fileprovider", outputImage);
                }
                // 启动相机程序
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, TAKE_PHOTO);

这段代码的作用是创建File对象,用于存储拍照后的照片。实现的主要思路就是先在内存中创建一个File并获得他的Uri,然后启动相机程序,并设置intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);将拍出来的照片存放到指定Uri的内存空间。
另外,FileProvider是一个特殊的内容提供器,用于对真实的Uri进行封装以提高安全性

接下来在onActivityResult中接收结果并显示图片:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        // 将拍摄的照片显示出来
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        picture.setImageBitmap(bitmap);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
         default: 
                break;
                }
         }

然后在AndroidManifest.xml中对内容提供器进行注册:

<provider 
android:name="android.support.v4.content.FileProvider" 
android:grantUriPermissions="true" 
android:exported="false" 
//android:authorities的值要与FileProvider.getUriForFile()的第二个参数值保持一致
android:authorities="com.example.cameraalbumtest.fileprovider">
//<meta-data指定Uri的共享路径
<meta-data 
	android:name="android.support.FILE_PROVIDER_PATHS" 
	android:resource="@xml/file_paths"/>
</provider>

创建file_path.xml文件:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
	<external-path path="" name="my_images"/>
</paths>

这里external-path用来指示Uri共享的,name属性可以随便修改,path属性为空表示将整个SD卡进行共享

最后声明一下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

这样就可以完成拍照并存储照片到手机里的功能了~

猜你喜欢

转载自blog.csdn.net/Chushiniudao/article/details/83341811