2019/0619/安卓工作室_(硬體裝置與應用)相機操作&GPS+階段性作業6+延伸 ( APP End )
Last updated
Was this helpful?
Last updated
Was this helpful?
某一些版本的模擬器
實體內部儲存裝置無法寫入
會看不到擷取畫面回傳
必須要用外部儲存裝置儲存影像
開啟 AVD 管理器 進階 SDcard 改為 Extemal file
如果要外鍵SD卡檔案 可以利用 mksdcard 指令
切換到 sdk file emulator
然後就可以把產生的sd卡檔案放進專案的app後用emulator選擇
更改有
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
即可開啟
不管是5.0或6.0 都必須把Loction加入
GetLastKnownLocation 有時無法單獨呼叫
必須 requestLocationupdata
package com.example.application2;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class GPSActivity extends AppCompatActivity implements LocationListener {
private TextView outputTV;
private LocationManager lc;
private Location currentLocation;
private static final int PERMISSIONS_REQUEST_GPS = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gps);
outputTV = findViewById(R.id.lblOutput);
lc = (LocationManager) getSystemService(LOCATION_SERVICE);
if (!lc.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
AlertDialog.Builder builder_AL = new AlertDialog.Builder(this);
builder_AL.setTitle("GPS硬體功能").setMessage("GPS 功能目前狀態尚未啟用。\n請先啟用GPS!!").setPositiveButton("確定",null).create().show();
}
// Android 6.0以上版本的權限管理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSIONS_REQUEST_GPS);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == PERMISSIONS_REQUEST_GPS){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
outputTV.setText("取得GPS讀取權限-成功!!");
}
else{
outputTV.setText("取得GPS讀取權限-失敗!!");
}
}
}
@Override
public void onLocationChanged(Location location) {
double lat,lng;
String outputString;
if(location != null){
lat = location.getLatitude();
lng = location.getLongitude();
outputString = "定位提供者 : " + location.getProvider() ;
outputTV.setText( outputString + "\n緯度: " + lat + "\n經度: "+ lng);
currentLocation = location;
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
protected void onPause(){
super.onPause();
try{
lc.removeUpdates(this);
} catch(Exception ex){
outputTV.setText("取消註冊LocationListenerg 失敗 ");
}
}
@Override
protected void onResume(){
super.onResume();
int minDistance = 1 ;
int minTime = 1000;
try{
String s = lc.getBestProvider(new Criteria(), true);
if (s != null){
lc.requestLocationUpdates(s,minTime,minDistance,this);
}else{
outputTV.setText("請確認GPS已開啟");
}
} catch (SecurityException ex) {
outputTV.setText("重新註冊LocationListener失敗");
}
}
public void buttonSetGPS_Click(View view) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(i);
}
public void buttonGetGPS_Click(View v){
double lat ,lng;
String best = lc.getBestProvider(new Criteria(),true);
try{
currentLocation = lc.getLastKnownLocation(best);
if(currentLocation != null){
lat = currentLocation.getLatitude();
lng = currentLocation.getLongitude();
String outputString = "定位提供者 : " + currentLocation.getProvider() ;
outputTV.setText( outputString + "\n緯度: " + lat + "\n經度: "+ lng);
} else {
outputTV.setText("取得GPS 位置失敗!!");
}
} catch (SecurityException ex) {
outputTV.setText("沒有讀取GPS權限,請取得授權 !!");
}
}
public void buttonShowMap_Click(View view) {
double lat ,lng;
lat = currentLocation.getLatitude();
lng = currentLocation.getLongitude();
String label = "車站";
String query = lat + "," + lng + "(" + label + ")";
String uri = "geo:" + lat + "," + lng;
query = Uri.encode(query);
uri = uri + "?q=" + query + "?z=16";
Intent geoMap = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(geoMap);
}
}
座號:08姓名:劉育誠
利用課堂教學之Android SDK類別,MediaPlayer、VideoView,完成以下程式功能程式之設計,並整合利用Intent物件整合至主畫面:
1. 設計一個「MusicActivity」活動,實作音樂撥放使用者介面,用以提供音樂撥放畫面,並具備基礎之開始撥放、暫停撥放、停止撥放功能。
需要覆寫「onCompletion」方法,提供結束後重頭開始撥放
需要實作 button 的 Click事件,提供開始撥放、暫停撥放、停止撥放
需要覆寫「onDestroy」方法,當活動結束時釋放相關資原
2. 設計一個「VedioActivity」活動,實作影片撥放使用者介面,用以提供視訊撥放畫面,並具備基礎之開始、暫停、停止、快轉、巡覽功能。
需要使用「VideoView」物件,並取得影片位置,提供撥放功能
請利用 Uri 物件的parse()方法,提供VideoView物件需求的影片資源
需要使用「MediaController」物件,提供撥放影片時的控制功能
需要覆寫「onPause」方法,當活動暫停時停止撥放
3. 設計一個「CameraActivity」活動,配合Intent、模擬器相機,提供照相機使用者介面及基本拍攝、擷取畫面、前後鏡頭轉換功能。
需要使用「Intent」物件,並配合MediaStore.ACTION_IMAGE_CAPTU RE 動作類型,提供拍攝功能
請利用ImageView元件,提供拍攝畫面的顯示功能
需要覆寫「onActivityResult」方法,當內建相機活動傳回影像畫面時,顯示在ImageView元件上
4. 設計一個「GPSActivity」活動,實作衛星定位使用者介面,並提供地圖定位畫面,並具備隨著使用者移動更新GPS座標之功能。
需要實作「LocationListener」物件,並覆寫相關的方法,例如:「onLocation Changed」,提供更新GPS座標之功能
使用「Intent」物件,配合Intent.ACTION_VIEW動作類型,呼叫地圖
需要覆寫「onResume」、「onPause」方法,當活動處於被警狀態時暫停更新定位資料,提供節省耗電功能
結果畫面截圖:
(1) activity_main.xml
(2) activity_music.xml
(3) activity_video.xml
(4) activity_gps.xml
(5) activity_camera.xml
(1)
(2)
(3)
(4)
(5)
(1) AndroidManifest.xml
(2) CameraActivity.java
(3) GPSActivity.java
(4) MainActivity.java
(5) MusicActivity.java
(6) VideoActivity.java
(7) activity_camera.xml
(8) activity_gps.xml
(9) activity_main.xml
(10) activity_music.xml
(11) activity_video.xml
(1)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.application2">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.hardware.camera" />
<uses-permission android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--<activity android:name=".CameraActivity"></activity>-->
<!--<activity android:name=".VideoActivity" />-->
<!--<activity android:name=".MusicActivity" />-->
<!--<activity android:name=".MainActivity" />-->
<!--<activity android:name=".GPSActivity">-->
<activity android:name=".MusicActivity"></activity>
<activity android:name=".VideoActivity" />
<activity android:name=".CameraActivity" />
<activity android:name=".GPSActivity" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
(2)
package com.example.application2;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
public class CameraActivity extends AppCompatActivity {
private ImageView image;
private static final int REQUEST_IMAGE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
image = findViewById(R.id.imageView);
}
public void button_Click(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ((requestCode == REQUEST_IMAGE) && (resultCode == Activity.RESULT_OK)) {
Bitmap userImage = (Bitmap) data.getExtras().get("data");
image.setImageBitmap(userImage);
}
}
}
(3)
package com.example.application2;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class GPSActivity extends AppCompatActivity implements LocationListener {
private TextView outputTV;
private LocationManager lc;
private Location currentLocation;
private static final int PERMISSIONS_REQUEST_GPS = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gps);
outputTV = findViewById(R.id.lblOutput);
lc = (LocationManager) getSystemService(LOCATION_SERVICE);
if (!lc.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
AlertDialog.Builder builder_AL = new AlertDialog.Builder(this);
builder_AL.setTitle("GPS硬體功能").setMessage("GPS 功能目前狀態尚未啟用。\n請先啟用GPS!!").setPositiveButton("確定",null).create().show();
}
// Android 6.0以上版本的權限管理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSIONS_REQUEST_GPS);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == PERMISSIONS_REQUEST_GPS){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
outputTV.setText("取得GPS讀取權限-成功!!");
}
else{
outputTV.setText("取得GPS讀取權限-失敗!!");
}
}
}
@Override
public void onLocationChanged(Location location) {
double lat,lng;
String outputString;
if(location != null){
lat = location.getLatitude();
lng = location.getLongitude();
outputString = "定位提供者 : " + location.getProvider() ;
outputTV.setText( outputString + "\n緯度: " + lat + "\n經度: "+ lng);
currentLocation = location;
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
protected void onPause(){
super.onPause();
try{
lc.removeUpdates(this);
} catch(Exception ex){
outputTV.setText("取消註冊LocationListenerg 失敗 ");
}
}
@Override
protected void onResume(){
super.onResume();
int minDistance = 1 ;
int minTime = 1000;
try{
String s = lc.getBestProvider(new Criteria(), true);
if (s != null){
lc.requestLocationUpdates(s,minTime,minDistance,this);
}else{
outputTV.setText("請確認GPS已開啟");
}
} catch (SecurityException ex) {
outputTV.setText("重新註冊LocationListener失敗");
}
}
public void buttonSetGPS_Click(View view) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(i);
}
public void buttonGetGPS_Click(View v){
double lat ,lng;
String best = lc.getBestProvider(new Criteria(),true);
try{
currentLocation = lc.getLastKnownLocation(best);
if(currentLocation != null){
lat = currentLocation.getLatitude();
lng = currentLocation.getLongitude();
String outputString = "定位提供者 : " + currentLocation.getProvider() ;
outputTV.setText( outputString + "\n緯度: " + lat + "\n經度: "+ lng);
} else {
outputTV.setText("取得GPS 位置失敗!!");
}
} catch (SecurityException ex) {
outputTV.setText("沒有讀取GPS權限,請取得授權 !!");
}
}
public void buttonShowMap_Click(View view) {
double lat ,lng;
lat = currentLocation.getLatitude();
lng = currentLocation.getLongitude();
String label = "車站";
String query = lat + "," + lng + "(" + label + ")";
String uri = "geo:" + lat + "," + lng;
query = Uri.encode(query);
uri = uri + "?q=" + query + "?z=16";
Intent geoMap = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(geoMap);
}
}
(4)
package com.example.application2;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void btn_activity_music_Click(View view) {
Intent intent = new Intent(this,MusicActivity.class);
startActivity(intent);
}
public void btn_activity_vedio_Click(View view) {
Intent intent = new Intent(this,VideoActivity.class);
startActivity(intent);
}
public void btn_activity_gps_Click(View view) {
Intent intent = new Intent(this,GPSActivity.class);
startActivity(intent);
}
public void btn_activity_camera_Click(View view) {
Intent intent = new Intent(this,CameraActivity.class);
startActivity(intent);
}
}
(5)
package com.example.application2;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MusicActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener{
private TextView output;
private MediaPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
output = findViewById(R.id.lblOutput);
player = MediaPlayer.create(this,R.raw.piano01);
player.setOnCompletionListener(this);
}
@Override
public void onCompletion(MediaPlayer mp) {
output.setText("音樂播放完畢....");
player.seekTo(0);
}
public void button_Click(View v){
if (player != null){
if(player.isPlaying() != true){
player.start();
output.setText("音樂播放中...");
}
}
}
public void button2_Click(View v){
output.setText("音樂暫停播放...");
if (player != null){
player.pause();
}
}
public void button3_Click(View v){
output.setText("音樂停止播放...");
if (player != null){
player.stop();
player.prepareAsync();
}
}
@Override
public void onDestroy(){
super.onDestroy();
if (player != null){
player.release();
}
}
}
(6)
package com.example.application2;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
public class VideoActivity extends AppCompatActivity {
private VideoView video;
private String videoFile = "point21";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
video = findViewById(R.id.videoView);
// int id = getResources().getIdentifier(videoFile,"raw",this.getPackageName());
int id = R.raw.point21;
String path = "android.resource://" + this.getPackageName() + "/" + id;
video.setVideoURI(Uri.parse(path));
video.setMediaController(new MediaController(this));
video.start();
}
@Override
public void onPause(){
super.onPause();
video.stopPlayback();
}
}
(7)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
>
<Button
android:text="啟動相機照相"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/button"
android:onClick="button_Click" />
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView"
android:scaleType="fitCenter"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
(8)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GPS資訊:"
android:layout_margin="10dp"
android:id="@+id/lblOutput"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="設定GPS"
android:layout_margin="10dp"
android:id="@+id/buttonSetGPS"
android:onClick="buttonSetGPS_Click"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取得GPS座標"
android:layout_margin="10dp"
android:id="@+id/buttonGetGPS"
android:onClick="buttonGetGPS_Click"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="顯示Google地圖"
android:layout_margin="10dp"
android:id="@+id/buttonShowMap"
android:onClick="buttonShowMap_Click"
/>
</LinearLayout>
(9)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<TextView
android:id="@+id/text_1"
android:layout_width="match_parent"
android:layout_height="50sp"
android:layout_columnSpan="2"
android:gravity="center"
android:text="階段性作業6"
android:textColor="#000000"
android:textSize="30sp" />
<TextView
android:id="@+id/text_2"
android:layout_width="match_parent"
android:layout_height="50sp"
android:layout_columnSpan="2"
android:gravity="center"
android:text="How To Mack a Good Photo!!"
android:textColor="#000000"
android:textSize="20sp" />
<Button
android:id="@+id/btn_activity_music"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:gravity="center"
android:text="MusicPlayer"
android:textColor="#1D7E38"
android:textSize="20sp"
android:onClick="btn_activity_music_Click" />
<Button
android:id="@+id/btn_activity_vedio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:gravity="center"
android:text="ViedoPlayer"
android:textColor="#66A2AC"
android:textSize="20sp"
android:onClick="btn_activity_vedio_Click" />
<Button
android:id="@+id/btn_activity_gps"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:text="GPSLocation"
android:textColor="#9454B6"
android:textSize="20sp"
android:onClick="btn_activity_gps_Click" />
<Button
android:id="@+id/btn_activity_camera"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:text="CameraPhoto"
android:textColor="#E07054"
android:textSize="20sp"
android:onClick="btn_activity_camera_Click" />
<ImageView
android:id="@+id/tv_show"
android:layout_width="match_parent"
android:layout_height="200sp"
android:layout_columnSpan="2"
android:layout_gravity="fill"
android:layout_marginLeft="1dp"
android:layout_marginTop="1dp"
android:layout_marginRight="1dp"
android:layout_marginBottom="1dp"
android:background="#EEEEE0"
android:scaleType="fitXY"
android:src="@drawable/main" />
</LinearLayout>
(10)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
>
<Button
android:text="開始/繼續"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/button"
android:onClick="button_Click" />
<Button
android:text="暫停"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button"
android:layout_toEndOf="@+id/button"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:id="@+id/button2"
android:onClick="button2_Click" />
<Button
android:text="停止"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button2"
android:layout_toEndOf="@+id/button2"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:id="@+id/button3"
android:onClick="button3_Click" />
<TextView
android:text="撥放狀態"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="33dp"
android:id="@+id/lblOutput" />
</RelativeLayout>
(11)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="媒體播放器"
android:id="@+id/textView" />
<VideoView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="23dp"
android:id="@+id/videoView" />
</RelativeLayout>
繳交作業時,請以FTP上傳程式原始檔與本文件檔各一份,原始程式碼請另放置在一個資料夾內。
※以上各項均須完成始得通過※
沒講完但有PPT跟書
App課程結束