zoukankan      html  css  js  c++  java
  • Android里的多媒体

    一、通知:即显示在手机下滑框的消息。

           NotificationManager:通知管理器, 用来发送通知

                     有以下方法:

         (NotificationManager)getSystemService(NOTIFICATION_SERVICE):获得NotificationManager
         notify(int,Notification):发送通知,传入通知的id(每个通知都不能相同)和要发送的通知

           Notification.Builder:通知构建器,用来构建通知和设置通知各种参数

                     有以下方法:

    		new Notification.Builder(Context):构建一个Notification.Builder
    		builder.setSmallIcon(R.drawable.ic_launcher); //设置图标
    		builder.setTicker("小红给你发来了一条信息");	  //显示最先在顶部收到的通知 
    		builder.setContentTitle("通知"); 	//设置标题
    		builder.setContentText("点击查看详细内容"); //消息内容
    		builder.setWhen(System.currentTimeMillis()); //发送时间
    		builder.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,光
    		builder.setAutoCancel(true);//打开程序后图标消失
                    builder.setSmallIcon(R.mipmap.ic_launcher)//设置小图标
                    builder.setWhen(System.currentTimeMillis())//设置通知的时间
    
    		//设置通知播放音频,指定路径下的音频
    		builder.setSound(Uri.fromFile(new File("音频路径")));
    		//设置通知振动:下标为偶数表示静止时长,奇数为振动时长,单位为毫秒
    		//需在注册地方声明权限:
                    //<uses-permission android:name="android.permission.VIBRATE" />
    		long[] vibrates= {0,1000,1000,1000};//此时立即振动,然后静止一秒,再振动一次
    		builder.setVibrate(vibrates);
    		
    		//设置通知响应的事件Activity,PendingIntent可以理解为延迟的Intent
    		Intent intent =new Intent (this,NotificationLayout.class);
    		PendingIntent pendingIntent =PendingIntent.getActivity(this, 0, intent,0);
    		builder.setContentIntent(pendingIntent);
    		
    		//构建一条通知Notification
    		Notification notification=builder.build();

            Notification:通知类,通过Notification.Builder的build()方法获得

               builder.build():构建一个Notification

    完整例子:

    public void onClick(View v) {
    		switch(v.getId()) {
    		case R.id.sendNotice:
    			NotificationManager manager=            
                      (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    			Notification.Builder builder=new Notification.Builder(this);
    			builder.setSmallIcon(R.drawable.ic_launcher); //设置图标
    			builder.setTicker("小红给你发来了一条信息");	  //显示最先在顶部收到的通知 
    			builder.setContentTitle("通知"); 	//设置标题
    			builder.setContentText("点击查看详细内容"); //消息内容
    			builder.setWhen(System.currentTimeMillis()); //发送时间
    			builder.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音振动方式灯光
    			builder.setAutoCancel(true);//打开程序后图标消失
    			//设置通知播放音频,指定路径下的音频
    			builder.setSound(Uri.fromFile(new 
                                  File("/system/media/audio/ringtones/Basic_tone.ogg")));
    			//设置通知振动:下标为偶数表示静止时长,奇数为振动时长,单位为毫秒
    			//(需在注册地方声明权限:
                            //<uses-permission android:name="android.permission.VIBRATE" />)
    			long[] vibrates= {0,1000,1000,1000};//此时立即振动,然后静止一秒,再振动一次
    			builder.setVibrate(vibrates);
    			
    			//设置通知响应的事件Activity,PendingIntent可以理解为延迟的Intent
    			Intent intent =new Intent (this,NotificationLayout.class);
    			PendingIntent pendingIntent =PendingIntent.getActivity(this, 0, intent,0);
    			builder.setContentIntent(pendingIntent);
    			
    			Notification notification=builder.build();
    			manager.notify(1,notification);
    			
    		}
    	}

    二、短信

    发送短信和接收短信涉及权限:

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

           接收短信:当系统收到短信时会自动发送广播"android.provider.Telephony.SMS_RECEIVED"

           1、自定义广播接收器类

    
    	class MessageReceiver extends BroadcastReceiver{
    		//接收到系统短信广播进行的操作
    		@Override
    		public void onReceive(Context context, Intent intent) {
    			Bundle bundle=intent.getExtras();
    			Object[] pdus=(Object[])bundle.get("pdus");	//提取短信消息
    			SmsMessage[] message=new SmsMessage[pdus.length];
    	                String format = intent.getStringExtra("format");
    			for(int i=0;i<message.length;i++) {
    				message[i]=SmsMessage.createFromPdu((byte[])pdus[i],format);
    			}
    			String address=message[0].getOriginatingAddress();//获取发送方号码
    			String fullMessage="";
    			for(SmsMessage body:message) {
    				fullMessage+=body.getMessageBody();//获取短信内容
    			}
    			sender.setText(address);
    			content.setText(fullMessage);
    		}
    	}

          2、主活动onCreate()里注册广播接收器和onDestroy()取消注册广播接收器

    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);
    		messageReceiver=new MessageReceiver();
    		intentfilter=new IntentFilter();
    		intentfilter.addAction("android.provider.Telephony.SMS_RECEIVED");
    		registerReceiver(messageReceiver, intentfilter);
        }
    public void onDestroy() {
    		super.onDestroy();
    		//取消注册接收信息的广播接收器
    		unregisterReceiver(messageReceiver);
        }

           发送短信:在onCreate()里利用SmsManager发送短信,增加了一个广播接收器判断短信是否发出
     

    class sendStatusReceiver extends BroadcastReceiver{
    		//接收发送广播状态的广播,进行判断
    		@Override
    		public void onReceive(Context context, Intent intent) {
    			if(this.getResultCode()==RESULT_OK) {
    				Toast.makeText(context, "Send succeed", Toast.LENGTH_SHORT).show();
    			}else {
    				Toast.makeText(context, "Send failed", Toast.LENGTH_SHORT).show();
    			}
    		}
    }
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //发送短信部分
            to=(EditText)findViewById(R.id.to);
            msgInput=(EditText)findViewById(R.id.input);
            send=(Button)findViewById(R.id.send);
            intentfilter=new IntentFilter();
            intentfilter.addAction("SENT_SMS_ACTION");
            sendStatusReceiver=new sendStatusReceiver();
            registerReceiver(sendStatusReceiver,intentfilter);
            send.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    SmsManager smsManager=SmsManager.getDefault();
                    Intent sendIntent=new Intent("SENT_SMS_ACTION");
                    PendingIntent pi=PendingIntent.getBroadcast(MainActivity.this, 0,     
                     sendIntent, 0);
                    smsManager.sendTextMessage(to.getText().toString(), null, 
                       msgInput.getText().toString(),pi, null);
                }
                
            });
    }
    public void onDestroy() {
    	super.onDestroy();
    	//取消注册接收发送信息状态变化的广播
    	unregisterReceiver(sendStatusReceiver);
    }

    三、打开相机和打开相册:代码都有注释直接看代码

    需要读权限
       

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

    不需要写权限

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

    布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.mediatest.MainActivity" >
    
        <Button
            android:id="@+id/choose_photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Choose photo" />
    
        <Button
            android:id="@+id/take_photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Take photo" />
    
        <ImageView
            android:id="@+id/picture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />
    
    </LinearLayout>
    

    对应活动代码:

    public class MainActivity extends Activity {
    	private Button takePhoto;
    	private Button choosePhoto;
    	private ImageView picture;
    	private Uri imageUri;
    	@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) {
    				// TODO Auto-generated method stub
    				File outputPicture = new File(getExternalCacheDir(), "why.jpg");
    		        if (outputPicture.exists()) {//如果照片文件存在则删除
    		            outputPicture.delete();
    		        }
    		        try {
    		            outputPicture.createNewFile();//创建一个新照片文件
    		        } catch (IOException e) {
    		            e.printStackTrace();
    		        }
    		        //"android.media.action.IMAGE_CAPTURE"用来隐式启动活动来启动相机
    		        imageUri = Uri.fromFile(outputPicture);//将文件解析成Uri
    		        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    		        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    		        startActivityForResult(intent, 1);//启动相机程序,并返回onActivityResult()方法
    			}
    		});
    		choosePhoto=(Button)findViewById(R.id.choose_photo);
    		choosePhoto.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				//将活
    				Intent intent=new Intent("android.intent.action.GET_CONTENT");
    				intent.setType("image/*");	//设置启动类型为照片,此时结果为3对应活动打开相册
    				startActivityForResult(intent,3);
    			}
    			
    		});
    	}
    	@Override
        protected void onActivityResult(int requestCode, int result, Intent data) {
            switch (requestCode) {
        		//裁剪照片
                case 1:
                    if(result==RESULT_OK) {
                    	Intent intent=new Intent("com.android.camera.action.CROP");
                    	//Data是指储存的数据(即当前照片的Uri)
                    	//Type是启动的类型:目前为照片(一般在需要裁剪照片和启动相机时使用)
                    	intent.setDataAndType(imageUri, "image/*");
                    	intent.putExtra("scale", true);
                    	intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    	startActivityForResult(intent,2);
                    }
                //压缩照片并显示
                case 2:
                	if (result == RESULT_OK) {
                        try {
                        	//获取图片
                            Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                            //压缩图片在手机存储空间的内存  
                            ByteArrayOutputStream out = new ByteArrayOutputStream();
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);//80指保留80品质,压缩20品质
                            
                            //显示照片
                            picture.setImageBitmap(bitmap);
    
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                //打开相册
                case 3:
                	if (result == RESULT_OK) {
                		//必须重写handleImageOnKitKat(Intent)和handleImageBeforeKitKat(Intent)方法
    	            	if(Build.VERSION.SDK_INT>=19) {
    	                    //4.4(API 19)以上版本实现打开相册
    	                    handleImageOnKitKat(data);
    	            	}
    	            	else {
    	            		//4.4以下版本实现打开相册
    	            		handleImageBeforeKitKat(data);
    	            	}
                	}
                    break;
            }
        }
    
        private void handleImageBeforeKitKat(Intent data) {
    		Uri uri=data.getData();
    		String imagePath=getImagePath(uri,null);
    		showImage(imagePath);
    	}
    	@TargetApi(Build.VERSION_CODES.KITKAT)
    	@SuppressLint("NewApi")
    	private void handleImageOnKitKat(Intent data) {
            //获取资源定位符
            Uri uri = data.getData();
            String imagePath=getImagePath(uri);
            showImage(imagePath);
        }
    	//解析Uri返回图片路径
        @SuppressLint("NewApi")
    	private String getImagePath(Uri uri) {
        	//选择图片路径
            String imagePath = null;
            if (DocumentsContract.isDocumentUri(this, uri)) {
                String docId = DocumentsContract.getDocumentId(uri);
                if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                    String id = docId.split(":")[1];
                    String selection = MediaStore.Images.Media._ID + "=" + id;
                    imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
                } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                    Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                    imagePath = getImagePath(contentUri, null);
                }
    
            } else if ("content".equalsIgnoreCase(uri.getScheme())) {
                imagePath = getImagePath(uri, null);
            } else if ("file".equalsIgnoreCase(uri.getScheme())) {
                imagePath = uri.getPath();
            }
    		return imagePath;
        }
        //子方法:根据Uri和selection返回图片路径
        private String getImagePath(Uri externalContentUri, String selection) {
            String path = null;
            Cursor cursor = getContentResolver().query(externalContentUri, null, selection, null, null);
            if (cursor != null) {
                if (cursor.moveToFirst()) {
                    path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                }
                cursor.close();
            }
            return path;
        }
        //根据图片路径显示图片
        private void showImage(String imagePath) {
            if (imagePath != null) {
                Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
                /*
                   setlmageBitmap(Bitmap bm):使用 Bitmap 位图设置该 ImageView 显示的图片。
    
    			   setlmageDrawable(Drawable drawable):使用 Drawable 对象设置该 ImageView 显示的图片。
    
    			   setlmageResource(int resld):使用图片资源ID设置该ImageView显示的图片。
    
    			   setlmageURI(Uri uri):使用图片的URI设置该ImageView显示的图片。
                 */
                picture.setImageBitmap(bitmap);
            } else {
                Toast.makeText(this, "没有找到对应图片", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    四、播放音频和视频

    补充知识:

    1、需要读取权限

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

    2、获取系统内存根目录位置方法和SD卡根目录位置方法

    //内存根目录获取方法:Environment.getExternalStorageDirectory()
    
    //获取SD卡根路径方法:
    public static String getSDPath(Context context) {  
    
          StorageManager mStorageManager = (StorageManager)
                    context.getSystemService(Context.STORAGE_SERVICE);
            Class<?> storageVolumeClazz = null;
            try {
                storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
                Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
                Method getPath = storageVolumeClazz.getMethod("getPath");
                Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
                Object result = getVolumeList.invoke(mStorageManager);
                final int length = Array.getLength(result);
                for (int i = 0; i < length; i++) {
                    Object storageVolumeElement = Array.get(result, i);
                    String path = (String) getPath.invoke(storageVolumeElement);
                    boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
                    if (removable) {
                        return path;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
    }

    1、播放音频:使用MediaPlayer类

               MediaPlayer类有以下方法:

               setDataSource():设置播放音频文件位置

               prepare():在开始播放前调用此方法完成准备工作

               start():开始或继续播放音频

               pause():暂停播放音频

               reset():将MediaPlayer对象重置到刚刚创建状态

               seekTo():从指定位置开始播放音频

               stop():停止播放音频

               release():释放掉与MediaPlayer对象相关资源

               isPlaying():判断是否正在播放音频

               getDuration():获取载入的音频文件时长

    2、播放视频:使用VideoView类

               VideoView类有以下方法:

               setVideoPath():设置视频文件位置

               start():开始或继续播放视频

               pause():暂停播放视频

               resume():将视频从头开始播放

               seekTo():从指定位置开始播放视频

               isPlaying():判断是否正在播放视频

               getDuration():获取载入的视频文件时长

    播放音频完整代码演示

    public class MusicActivity extends Activity implements OnClickListener{
    	private Button play;
    	private Button pause;
    	private Button stop;
    	private MediaPlayer mediaPlayer=new MediaPlayer();
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.music);
    		play=(Button)findViewById(R.id.play);
    		pause=(Button)findViewById(R.id.pause);
    		stop=(Button)findViewById(R.id.stop);
    		play.setOnClickListener(this);
    		pause.setOnClickListener(this);
    		stop.setOnClickListener(this);
    		initMediaPlayer();
    	}
    
    
    
    
    //获取SD卡根路径方法:
    public static String getSDPath(Context context) {  
    
          StorageManager mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
            Class<?> storageVolumeClazz = null;
            try {
                storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
                Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
                Method getPath = storageVolumeClazz.getMethod("getPath");
                Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
                Object result = getVolumeList.invoke(mStorageManager);
                final int length = Array.getLength(result);
                for (int i = 0; i < length; i++) {
                    Object storageVolumeElement = Array.get(result, i);
                    String path = (String) getPath.invoke(storageVolumeElement);
                    boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
                    if (removable) {
                        return path;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
    }
    	@Override
    	public void onClick(View v) {
    		switch(v.getId()) {
    		case R.id.play:
    			if(!mediaPlayer.isPlaying()) {
    				mediaPlayer.start();
    			}break;
    		case R.id.pause:
    			if(mediaPlayer.isPlaying()) {
    				mediaPlayer.pause();
    			}break;
    		case R.id.stop:
    			if(mediaPlayer.isPlaying()) {
    				mediaPlayer.reset();
    				initMediaPlayer();
    			}break;
    		default:break;
    		}
    	}
    	public void onDestroy() {
    		super.onDestroy();
    		if(mediaPlayer!=null) {
    			mediaPlayer.stop();
    			mediaPlayer.release();
    		}
    	}
    	//初始化音频文件方法:设置音频位置,完成准备工作
    	private void initMediaPlayer() {
    		try {
    			File file=new File(getSDPath(this),"aiying.mp3");
    			mediaPlayer.setDataSource(file.getPath());
    			mediaPlayer.prepare();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    播放视频完整代码演示

    public class VedioActivity extends Activity implements OnClickListener{
    	private VideoView videoView;
    	private Button play;
    	private Button pause;
    	private Button replay;
    	
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.vedio);
    		videoView=(VideoView)findViewById(R.id.videoView1);
    		play=(Button)findViewById(R.id.play_vieo);
    		pause=(Button)findViewById(R.id.pause_vieo);
    		replay=(Button)findViewById(R.id.replay);
    		play.setOnClickListener(this);
    		pause.setOnClickListener(this);
    		replay.setOnClickListener(this);
    		initVideoPath();
    	}
    	private void initVideoPath() {
    		File file=new File(Environment.getExternalStorageDirectory(),"tiao.mp4");
    		videoView.setVideoPath(file.getPath());
    	}
    	@Override
    	public void onClick(View v) {
    		switch(v.getId()) {
    		case R.id.play_vieo:
    			if(!videoView.isPlaying()) {
    				videoView.start();
    			}
    			break;
    		case R.id.pause_vieo:
    			if(videoView.isPlaying()) {
    				videoView.pause();
    			}
    			break;
    		case R.id.replay:
    			if(videoView.isPlaying()) {
    				videoView.resume();
    			}
    			break;
    		}
    	}
    	public void onDestroy() {
    		super.onDestroy();
    		if(videoView!=null) {
    			videoView.suspend();
    		}
    	}
    }
  • 相关阅读:
    网上找的面试题-之一
    python里的Join函数
    【转载51CTO】Linux中引号那些事儿
    【面试编程题】巧妙排序:排序只有1,2,3三个元素的数组,不能统计1,2,3的个数。
    [转载]mininet的安装和使用
    Open vSwitch源码阅读【转】及自己的理解【稍后更新】
    7、8月份安排 进度条
    请不要忽视基础小细节
    【编程之美】2.20 程序理解问题
    GDOI2017爆炸记
  • 原文地址:https://www.cnblogs.com/MrQlyn/p/10236334.html
Copyright © 2011-2022 走看看