国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

第二行代碼第八章筆記

2019-11-08 00:02:14
字體:
來源:轉載
供稿:網友

很久沒有更新博客了,其實已經寫好了,只不過一直沒發表,希望遇到大神多提提意見

豐富你的程序 – 運用手機多媒體

將程序運行到手機上

先通過數據線把手機連接到電腦上。然后進入到設置 –> 開發者選項界面,在這個界面中勾選USB調試選項

注意從Android4.2系統開始,開發者選項是默認隱藏的,需要先進入到”關于手機”界面,然后對著最下面的版本號那一欄連續點擊,就會讓開發者選項顯示出來

使用通知

通知(Notification)是Android系統中比較有特色的一個功能,當某個應用程序希望用戶發出一些提示信息,而該應用程序又不在前臺運行時,就可以借助通知來實現。發出一條通知后,手機最上方的狀態欄中會顯示一個通知圖標,下拉狀態欄后可以看到通知的詳細內容

通知的基本用法

通知既可以在活動里創建,也可以在廣播接收器里創建,當然還可以在服務里創建

創建通知的步驟

首先需要一個NotificationManager來對通知進行管理,可以調用Context的 getSystemService()方法獲取到。getSystemService()方法接收一個字符串參數用于闕東獲取系統的哪個服務,這里我們傳入Context.NOTIFICATION_SERVICE即可。因此獲取NotificationManager的實例就可以寫成:

NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

使用Builder構造器創建Notification對象。support-v4庫中提供了一個NotificationCompat類,這個類的構造器來創建Notification對象,就可以保證我們的程序在Android系統版本上都能正常工作了

Notification notification = new NotificationCompat.Builder(context).build();

在build()方法之前連綴任意多的設置方法來創建一個豐富的Notification對象

Notification notification = new NotificationCompat.Builder(this) .setContentTitle(“This is content title”) .setContentText(“This is content text”) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.ic_launcher)//設置通知的小圖標,注意只能使用alpha圖層的圖片進行設置,小圖標會顯示在系統狀態欄上 .setLargeIcon(BitmapFactory.decodeResource(getResources() , R.mipmap.ic_launcher))//設置系統的大圖標,當下拉系統狀態欄時,就可以看到設置的大圖標了 .build();

調用NotificationManager的notify()方法就可以讓通知顯示出來了。notify()方法接收兩個參數,第一個參數id,要保證每個通知所指定的id是不同的。第二個參數則是Notification對象,這里直接將我們剛剛創建好的Notification對象傳入即可

manager.notify(1 , notification);

新建體格NotificationTest項目,修改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:id="@+id/activity_main" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.demo.notificationtest.MainActivity"> <Button android:id="@+id/send_notice" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send notice" android:textAllCaps="false"/></LinearLayout>

修改MAinActivity中的代碼,如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override PRotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button sendNotice = (Button) findViewById(R.id.send_notice); sendNotice.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.send_notice: NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(this) .setContentTitle("This is content title") .setContentText("This is content text") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources() , R.mipmap.ic_launcher)) .build(); manager.notify(1 , notification); break; default: break; } }}

intent傾向于立即去執行某個動作,PendingIntent更加傾向于在某個合適的實際去執行某個動作

新建NotificationActivity,布局名為activity_notification.xml,布局中的代碼如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_notification" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.demo.notificationtest.NotificationActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="24sp" android:text="This is notification layout" /></RelativeLayout>

修改MAinActivity中的代碼,給通知加入點擊功能:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button sendNotice = (Button) findViewById(R.id.send_notice); sendNotice.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.send_notice: 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(this) .setContentTitle("This is content title") .setContentText("This is content text") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources() , R.mipmap.ic_launcher)) .setContentIntent(pi) .setAutoCancel(true)//當點擊這個通知的時候,通知會自動取消 .build(); manager.notify(1 , notification); break; default: break; } }}

設置手機振動: Notification notification = new NotificationCompat.Builder(this) … .setVibrate(new long[] { 0 , 1000 , 1000 , 1000})//長整形數組,用于設置手機靜止和振動的時長,以毫秒為單位。下標為0表示手機靜止的時長,下標為1的值表示手機振動的時長,下標為2的值又表示手機靜止的時長,依次類推 .build(); 想要控制手機振動還要聲明權限:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.demo.notificationtest"><uses-permission android:name="android.permission.VIBRATE"/> ...</manifest>

手機前置LED燈以綠色的燈光一閃一閃的效果,可以寫成:

Notification notification = new NotificationCompat.Builder(this)....setLights(Color.GREEN , 1000 , 1000)//第一個參數用于指定LED燈的顏色,第二個參數用于指定LED燈亮起的時長,以毫秒為單位,第三個參數用于指定LED燈俺去的時長,也是以毫秒為單位.build();

也可以直接使用通知的默認效果,它會根據當前手機的環境來決定播放什么鈴聲,以及如何振動,寫法如下:

Notification notification = new NotificationCompat.Builder(this)....setDefaults(NotificationCompat.DEFAULT_ALL).build();

調用攝像頭和相冊

調用攝像頭拍照

應用關聯緩存目錄:指SD卡中專門用于存放當前應用山村數據的位置,調用getExternalCacheDir()方法可以得到這個目錄,具體的路徑是/sdcard/Android/data//cache

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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.demo.camersalbumtest.MainActivity"> <Button android:id="@+id/take_picture" 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>

MAinActivity中的代碼:

public class MainActivity extends AppCompatActivity { public static final int TAKE_PHOTO = 1; private ImageView picture; private Uri imageUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button takePhoto = (Button) findViewById(R.id.take_picture); picture = (ImageView) findViewById(R.id.picture); takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //創建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 = FileProvider.getUriForFile(MainActivity.this , "com.demo.camersalbumtest.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); } }); } @Override 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 (FileNotFoundException e) { e.printStackTrace(); } } break; default: break; } }}

AndroidManifest.xml 中的代碼

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.demo.camersalbumtest"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/A右擊res目錄→new→Directory,創建一個xml目錄,接著右擊xml目錄→New→File,創建一個file_paths.xml文件,然后修改file_paths.xml文件中的內容,如下所示:

<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path=""/></paths>

從相冊中選擇照片

修改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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.demo.camersalbumtest.MainActivity"> <Button android:id="@+id/take_picture" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Take Photo" android:textAllCaps="false"/> <Button android:id="@+id/choose_from_album" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Choose From Album" android:textAllCaps="false"/> <ImageView android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /></LinearLayout>

MAinActivity中的代碼:

public class MainActivity extends AppCompatActivity { public static final int TAKE_PHOTO = 1; private ImageView picture; private Uri imageUri; private static final int CHOOSE_PHOTO = 2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button takePhoto = (Button) findViewById(R.id.take_picture); Button chooseFromAlbum = (Button) findViewById(R.id.choose_from_album); picture = (ImageView) findViewById(R.id.picture); chooseFromAlbum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { 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(); } } }); takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //創建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 = FileProvider.getUriForFile(MainActivity.this , "com.demo.camersalbumtest.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); } }); } private void openAlbum() { Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); startActivityForResult(intent , CHOOSE_PHOTO);//打開相冊 } @Override public 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: } } @Override 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 (FileNotFoundException e) { e.printStackTrace(); } } break; case CHOOSE_PHOTO: if (resultCode == RESULT_OK) { //判斷手機系統版本號 if (Build.VERSION.SDK_INT >= 19) { //4.4及以上系統使用這個方法處理文件 handleImageOnKitKat(data); } else { //4.4及以下系統使用這個方法處理圖片 handleImageBeforeKitKat(data); } } default: break; } } private void handleImageBeforeKitKat(Intent data) { Uri uri = data.getData(); String imagePath = getImagePath(uri , null); displayImage(imagePath); } private void displayImage(String imagePath) { if (imagePath != null) { Bitmap bitmap = BitmapFactory.decodeFile(imagePath); picture.setImageBitmap(bitmap); } else { Toast.makeText(this , "failed to get image" , Toast.LENGTH_SHORT).show(); } } private String getImagePath(Uri uri, String selection) { String path = null; //通過Uri和selection來獲取真實的圖片路徑 Cursor cursor = getContentResolver().query(uri , 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 handleImageOnKitKat(Intent data) { String imagePath = null; Uri uri = data.getData(); if (DocumentsContract.isDocumentUri(this , uri)) { //如果是document類型的uri,則通過是document id處理 String docId = DocumentsContract.getDocumentId(uri); if ("com.android.providers.media.documents".equals(uri.getAuthority())) { String id = docId.split(":")[1];//解析出數字格式的id 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())){ //如果是content類型的uri,則使用普通方式處理 imagePath = getImagePath(uri , null); } else if ("file".equalsIgnoreCase(uri.getScheme())) { //如果是file類型的uri,直接獲取圖片路徑即可 imagePath = uri.getPath(); } displayImage(imagePath);//根據圖片路徑顯示圖片 } }}

Android系統從4.4版本開始,選取相冊中的圖片不再返回圖片真實的Uri了,而是一個封裝過的 Uri,因此如果是4.4版本以上的手機就需要對這個Uri進行解析才行

某些照片即使經過裁剪后體積仍然很大,直接加載到內存中有可能會導致程序崩潰。更好的做法是根據項目的需求先對照片進行適當的壓縮,然后加載到內存中

播放多媒體文件

新建一個PlayAutoTest項目,修改 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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.demo.playaudiotest.MainActivity"> <Button android:id="@+id/play" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="play" android:textAllCaps="false" /> <Button android:id="@+id/pause" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="pause" android:textAllCaps="false" /> <Button android:id="@+id/stop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="stop" android:textAllCaps="false" /></LinearLayout>

MAinActivity中的代碼如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private MediaPlayer mediaPlayer = new MediaPlayer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button play = (Button) findViewById(R.id.play); Button pause = (Button) findViewById(R.id.pause); Button stop = (Button) findViewById(R.id.stop); play.setOnClickListener(this); pause.setOnClickListener(this); stop.setOnClickListener(this); 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();//初始化MediaPlayer } } private void initMediaPlayer() { try { File file = new File(Environment.getExternalStorageDirectory() , "music.mp3"); mediaPlayer.setDataSource(file.getPath());//指定音頻文件的路徑 mediaPlayer.prepare();//讓MediaPlayer進入到準備狀態 } catch (IOException e) { e.printStackTrace(); } } @Override public 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 , "拒絕權限將無法使用程序" , Toast.LENGTH_SHORT).show(); finish(); } break; default: } } @Override public void onClick(View view) { switch (view.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; } } @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null ){ mediaPlayer.stop(); mediaPlayer.release(); } }}

在 AndroidManifest.xml中添加權限:

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

播放視頻

主要使用VideoView類來實現,這個類將視頻的顯示和控制集于一身,設的我們僅僅借助它就可以完成一個建議的視頻播放器

新建 PlayVideoTest 項目,然后修改activity_main.xml中的代碼,如下所示:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/play" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Play" /> <Button android:id="@+id/pause" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Pause" /> <Button android:id="@+id/replay" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Replay" /> </LinearLayout> <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>

MAinActivity中的代碼如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private VideoView videoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView = (VideoView) findViewById(R.id.video_view); Button play = (Button) findViewById(R.id.play); Button pause = (Button) findViewById(R.id.pause); Button replay = (Button) findViewById(R.id.replay); play.setOnClickListener(this); pause.setOnClickListener(this); replay.setOnClickListener(this); 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 { initVideoPath(); // 初始化MediaPlayer } } private void initVideoPath() { File file = new File(Environment.getExternalStorageDirectory(), "movie.mp4"); videoView.setVideoPath(file.getPath()); // 指定視頻文件的路徑 } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initVideoPath(); } else { Toast.makeText(this, "拒絕權限將無法使用程序", Toast.LENGTH_SHORT).show(); finish(); } break; default: } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.play: if (!videoView.isPlaying()) { videoView.start(); // 開始播放 } break; case R.id.pause: if (videoView.isPlaying()) { videoView.pause(); // 暫停播放 } break; case R.id.replay: if (videoView.isPlaying()) { videoView.resume(); // 重新播放 } break; } } @Override protected void onDestroy() { super.onDestroy(); if (videoView != null) { videoView.suspend(); } }}

注意:VideoView并不是一個萬能的視頻播放工具類,它在視頻格式的支持以及播放效率方面都存在著較大的不足是。所以,如果想要僅僅使用ideoView就編寫一個功能非常強大的視頻播放器是不太現實的


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌拉特后旗| 开远市| 三门县| 论坛| 孟津县| 达州市| 东海县| 陆丰市| 依安县| 潍坊市| 大名县| 昌江| 宜兴市| 滕州市| 夹江县| 云阳县| 封丘县| 金门县| 新平| 普定县| 桐梓县| 台山市| 涟水县| 青阳县| 永修县| 临澧县| 高邮市| 浦江县| 张掖市| 玉田县| 仪征市| 黄大仙区| 淳化县| 河东区| 洛浦县| 富顺县| 维西| 酒泉市| 长治县| 武平县| 亳州市|