多媒体

  • 多媒体是什么?
  • 通知
  • 调用摄像头
  • 调用相册
  • 播放音频
  • 播放视频

多媒体是什么?

多媒体包括视频、音频等一系列娱乐功能。

通知

当应用程序不在前台运行,但又希望给用户发送信息时,就需要借助通知。发出通知后,手机状态栏会有通知图标,下拉状态栏可以查看具体的通知内容。

修改activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/notice"android:layout_height="wrap_content"android:text="send notice"android:layout_width="match_parent"/></LinearLayout>

为按钮添加点击事件:

  • 创建PendingIntent为通知的点击事件,第一个参数为context,第二个参数为0,第三个参数为intent,第四个参数为0
  • 通过getSystemService(NOTIFICATION_SERVICE)获取NotificationManager
  • 通过Notification.Builder构建出Builder实例,设置相关属性
  • 如果SDK大于26还需要创建NotificationChannel并设置setChannelId
  • 通过builder.build()构建Notification实例
  • 调用NotificationManager的notify()方法,传入唯一id和Notification实例
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button start = findViewById(R.id.start_service);start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, otherActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);Notification.Builder builder = new Notification.Builder(MainActivity.this).setContentTitle("title").setContentText("text").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).setContentIntent(pendingIntent).setAutoCancel(true);if (Build.VERSION.SDK_INT > 26) {NotificationChannel notificationChannel = new NotificationChannel("1", "test", NotificationManager.IMPORTANCE_DEFAULT);notificationManager.createNotificationChannel(notificationChannel);builder.setChannelId("1");}Notification notification = builder.build();notificationManager.notify(1,notification);}});}
}

效果图:

另外,取消通知还可以通过,其中1为创建时的id:

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(1);

通知还可以加上音频提醒:

.setsound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))

加上震动,接受长整型数组,偶数下标为静止时间,奇数下标为震动时间,震动需要申明权限VIBRATE:

.setVibrate(new long[]{0,1000,1000,1000})

加上LED呼吸灯,第一个参数为颜色,第二个参数为亮灯时长,第三个参数为暗灯时长:

.setLights(Color.GREEN,1000,1000)

如果需要显示长文字:

.setStyle(new NotificationCompat.BigTextStyle().bigText("xxxxxxxxxxxx"))

显示图片:

.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)))

设置优先级,有default、low、min、high、max可选:

.setPriority(NotificationCompat.PRIORITY_MAX)

调用摄像头

修改activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/take_photo"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="take photo" /><ImageViewandroid:id="@+id/picture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal" />
</LinearLayout>

修改MainActivity:

  • 创建File对象存储照片,通过getExternalCacheDir()方法放在sd卡应用关联缓存目录,具体为/sdcard/Android/data/<package name>/cache。如果放到其他位置需要进行运行时权限处理。
  • sdk不大于就调用Uri.fromFile转换成Uri对象,此时Uri标识真实路径
  • 但sdk24之后就不允许使用真实路径Uri,调用FileProvider.getUriForFile()方法将File对象转换成封装过的Uri对象,第一个参数为context,第二个参数为任意唯一字符串,第三个参数为File对象
  • 构建intent对象指定图片的输出地址
  • 拍照完回调onActivityResult()方法,解析照片进行显示
public class MainActivity extends AppCompatActivity {public static final int TAKE_PHOTO = 1;private ImageView picture;private Uri imageUri;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button takePhoto = findViewById(R.id.take_photo);picture = findViewById(R.id.picture);takePhoto.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {File outputImage = new File(getExternalCacheDir(), "outputImage.jpg");try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}if (Build.VERSION.SDK_INT >= 24) {imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbumtest.fileprovider", outputImage);} else {imageUri = Uri.fromFile(outputImage);}Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intent, TAKE_PHOTO);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case TAKE_PHOTO:if (resultCode == RESULT_OK) {try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));picture.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}break;default:break;}}
}

在Mainifest声明provider:

  • name为固定
  • authorities与FileProvider.getUriForFile()方法第二个参数一致
  • <meta-data>指定Uri路径,并引用一个资源
<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.example.cameraalbumtest.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />

在res下创建xml文件夹并创建file_paths.xml:

  • external-path指定Uri共享,
  • name随便填
  • path表示共享路径,空为整个sd卡共享
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="my_image"path=""/>
</paths>

调用相册

修改activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/choose_from_album"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="choose from album" /><ImageViewandroid:id="@+id/picture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal" />
</LinearLayout>

修改MainActivity:

  • 首先获取读写sd卡的运行时权限处理
  • 构建Intent跳转到相册程序选择照片
  • 回调onActivityResult根据sdk分别处理
  1. 因为sdk19以后就不能返回图片真实的Uri了,而是一个封装过的Uri
  2. 当大于sdk19时,还要分别判断Uri类型
  3. 当小于sdk19时,可直接从返回数据获取Uri
public class MainActivity extends AppCompatActivity {public static final int CHOOSE_PHOTO = 2;private ImageView picture;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);picture = findViewById(R.id.picture);Button chooseFromAlbum = findViewById(R.id.choose_from_album);chooseFromAlbum.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if ((ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);} else {openAlbum();}}});}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {openAlbum();} else {Toast.makeText(this, "you denied the permission", Toast.LENGTH_SHORT).show();}break;default:}}private void openAlbum() {Intent intent = new Intent("android.intent.action.GET_CONTENT");intent.setType("image/*");startActivityForResult(intent, CHOOSE_PHOTO);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case CHOOSE_PHOTO:if (resultCode == RESULT_OK) {if (Build.VERSION.SDK_INT >= 19) {handleImageOnKitkat(data);} else {handleImageBeforeKitkat(data);}}break;default:break;}}private void handleImageBeforeKitkat(Intent data) {Uri uri = data.getData();String ImagePath = getImagePath(uri, null);displayImage(ImagePath);}@TargetApi(19)private void handleImageOnKitkat(Intent data) {String imagePath = null;Uri uri = data.getData();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();}displayImage(imagePath);}private void displayImage(String imagePath) {if (imagePath != null) {Bitmap bitmap = BitmapFactory.decodeFile(imagePath);picture.setImageBitmap(bitmap);} else {Toast.makeText(this, "fail to get image", Toast.LENGTH_SHORT).show();}}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;}
}

播放音频

修改activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/play"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="play" /><Buttonandroid:id="@+id/pause"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="pause" /><Buttonandroid:id="@+id/stop"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="stop" /></LinearLayout>

添加权限:

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

修改MainActivity,获取运行时权限,并设置点击事件:

public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer =new MediaPlayer();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if ((ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);} else {initMediaPlayer();}Button play = findViewById(R.id.play);play.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (!mediaPlayer.isPlaying()) {mediaPlayer.start();}}});Button pause = findViewById(R.id.pause);pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}});Button stop = findViewById(R.id.stop);if (mediaPlayer.isPlaying()) {mediaPlayer.stop();}}private void initMediaPlayer() {File file = new File(Environment.getExternalStorageDirectory(), "music.mp3");try {mediaPlayer.setDataSource(file.getPath());mediaPlayer.prepare();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {initMediaPlayer();} else {Toast.makeText(this, "you denied the permission", Toast.LENGTH_SHORT).show();finish();}break;default:}}@Overrideprotected void onDestroy() {super.onDestroy();if (mediaPlayer != null) {mediaPlayer.stop();mediaPlayer.release();}}
}

播放视频

修改activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/play"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="play" /><Buttonandroid:id="@+id/pause"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="pause" /><Buttonandroid:id="@+id/replay"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="replay" /></LinearLayout><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

添加权限:

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

修改MainActivity,获取运行时权限:

public class MainActivity extends AppCompatActivity {private VideoView videoView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if ((ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);} else {initVideo();}videoView = findViewById(R.id.video_view);Button play = findViewById(R.id.play);play.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (!videoView.isPlaying()) {videoView.start();}}});Button pause = findViewById(R.id.pause);pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (videoView.isPlaying()) {videoView.pause();}}});Button replay = findViewById(R.id.replay);replay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (videoView.isPlaying()) {videoView.resume();}}});}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {initVideo();} else {Toast.makeText(this, "you denied the permission", Toast.LENGTH_SHORT).show();finish();}break;default:}}private void initVideo() {File file = new File(Environment.getExternalStorageDirectory(), "movie.mp4");videoView.setVideoPath(file.getPath());}@Overrideprotected void onDestroy() {super.onDestroy();if (videoView != null) {videoView.suspend();}}
}

Android基础——多媒体编程相关推荐

  1. Android基础——网络编程

    网络编程 网络编程是什么? WebView HttpURLConnection访问网络 HttpURLConnection最佳用法 网络编程是什么? 网络编程指Android系统使用http协议和服务 ...

  2. Android多媒体编程

    多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...

  3. 【Android基础】多线程编程

    介绍 当我们需要执行一些耗时操作时,比如发起一条网络请求,考虑到网速等因素的影响,服务器未必会立即响应我们的请求,如果不将这类操作放到子线程中去运行,会导致主线程被阻塞,从而影响用户对软件的正常使用. ...

  4. 【Xamarin开发 Android 系列 4】 Android 基础知识

    什么是Android? Android一词的本义指"机器人",同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件. ...

  5. [任务书+论文+PPT+源码]基于Android与多媒体的英文学习APP的设计与实现

    第1页 毕业设计(论文)题目:基于ANDROID与多媒体技术的英文学习APP的设计与实现设计(论文)要求及原始数据(资料):1.综述国内外移动互联现状及前景:2.了解ANDROID系统,理解ANDRO ...

  6. 基于Android与多媒体的英文学习APP的设计

    毕业设计(论文)任务书 第1页 毕业设计(论文)题目:基于Android与多媒体技术的英文学习APP的设计与实现设计(论文)要求及原始数据(资料):1.综述国内外移动互联现状及前景:2.了解Andro ...

  7. 最新Android基础入门教程目录(完结版)

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  8. Android基础知识——完善

    首页 下载App × Android基础知识--完善 布鲁马 2016.05.17 10:29* 字数 5478 阅读 2672评论 1喜欢 38 疯狂Android摘要,Android基础知识好乱好 ...

  9. android基础知识

    技术型男 随笔 - 20, 文章 - 0, 评论 - 4, 引用 - 0 android基础知识 1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速 ...

最新文章

  1. asp.net关于kindeditor 上传图片出现服务器故障的解决办法
  2. C++派生类构造函数调用规则
  3. jQuery中eq和get的区别
  4. Silverlight HTML5 Flash - RIA技术之三足鼎立
  5. 15.分布式文档系统-document id的手动指定与自动生成两种方式解析
  6. java怎么编程class,JAVA Class种
  7. c语言吧五子棋纯干货注释,请帮我注释下这个五子棋程序
  8. cad图形如何导入到奥维地图_CAD图导入奥维简易操作步骤--陈浩
  9. Github上关于iOS的各种开源项目集合
  10. QT5.11编译出现undefined reference to `_imp___ZN12QApplicationC1ERiPPci’
  11. 01 MQTT小例子-连接
  12. 看操作系统是x84还是x64啊
  13. 佛祖保佑永无BUG 代码 (各种样式)
  14. mac上Python版本不同时,给指定的版本安装库
  15. Excel添加固定文本到开头的2种操作方法
  16. java当中怎么测试异步接口【杭州多测师_王sir】【杭州多测师】
  17. 解决org.junit.runners.model.InvalidTestClassError: Invalid test class ‘xxx‘ 1. No runnable methods
  18. 如何快速体验腾讯云区块链长安链
  19. C++ 进程间通信详解
  20. WordPress DUX主题顶部添加彩色美化条

热门文章

  1. www.wwwwwwwwww
  2. 小波变换图像融合_【第11期 图像处理与仿真】 基于改进谱残差显著性图的红外与可见光图像融合...
  3. 安搭Share爱情人生
  4. pycharm对项目进行重命名后导致项目内文件一系列异常
  5. python画图库哪个好_小白开始学Python最著名的绘图库
  6. java和python哪个的前途更好?
  7. I2 2021-02-20-002-知学网
  8. java 版 mc 手柄_我的世界Java版21w06a
  9. Java实现贪吃蛇大作战小游戏(完整教程+源码)额外实现积分和变速功能
  10. 各大电商平台API接口调用、拼多多API接口获得淘宝商品详情