多媒體

多媒體

  1. 音樂播放器
  2. 視頻播放器
  3. 照相機
  4. 錄音機
  5. GPS

01. 音樂播放器

1. 在res目錄下創建raw文件夾,將音樂文件放置其中
2. 播放音樂,示例代碼:
    private void playMusic(Context context) {
        MediaPlayer player = MediaPlayer.create(context, R.raw.alarm);
        player.setVolume(1.0f, 1.0f);
        player.setLooping(true);
        player.start();
    }

02. 視頻播放器

public class MainActivity extends Activity {
  private VideoView vv;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    vv = (VideoView) findViewById(R.id.vv);
    //設置視頻源
    vv.setVideoPath("http://10.0.2.2:8080/news/10.mp4");
    //設置默認的控制面板
    vv.setMediaController(new MediaController(this));
    //啓動
    vv.start();
  }
}

03. 照相機

  1. 照相機

public class MainActivity extends Activity {
  private static final int REQUEST_CAMERA = 100;
  private static final int REQUEST_VIDEO = 200;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
  public void startCamera(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File file = new File(Environment.getExternalStorageDirectory(), "yz" + new Date().getTime() + ".jpg");
    // 給照相機設置保存相片的路徑
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    startActivityForResult(intent, REQUEST_CAMERA);
  }
  public void startVideoCamera(View view) {
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    File file = new File(Environment.getExternalStorageDirectory(), "yz" + new Date().getTime() + ".mp4");
    // 給照相機設置保存相片的路徑
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    startActivityForResult(intent, REQUEST_VIDEO);
  }
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CAMERA) {
      //RESULT_OK 這個值是Activity定義好的,所以可以直接使用
      if (resultCode == RESULT_OK) {
        Toast.makeText(this, "照相成功", Toast.LENGTH_LONG).show();
      } else {
        Toast.makeText(this, "照相失敗", Toast.LENGTH_LONG).show();
      }
    }else if (requestCode==REQUEST_VIDEO) {
      if (resultCode==RESULT_OK) {
        Toast.makeText(this, "攝像成功", Toast.LENGTH_SHORT).show();
      }else {
        Toast.makeText(this, "攝像失敗", Toast.LENGTH_SHORT).show();
      }
    }
  }
}
  1. 自定義照相機
    • 需求 : 實現一個自定義的相機App,參見360項目第四天筆記
    • 實現 : 參考docs/guide/topics/media/camera.html#custom-camera章節
  2. 偷拍功能的實現
    • 需求 : 實現偷拍功能的照相機
    • 實現 :
      1. 使用前置攝像頭拍照
      2. 去掉按鈕
      3. 去掉預覽畫面
      4. 使用透明樣式
      5. 拍照完成關閉當前頁面
      6. 6.

04. 錄音機

05. GPS

  1. 定位方式的介紹
    • 基站定位. 基站定位的原理是每個手機可以同時接收多個附近基站的信號,因爲基站的位置是固定的,所以根據基站信號強度,可以計算出手機所在的大概位置。基站越多,位置信息也就越精確。
    • WIFI定位. 因爲手機要連接WiFi,每一個WiFi都對應一個路由器,路由器都有mac地址,並且這個路由器一般在一段時間內位置不會發生變化。設備在開啓WiFi的情況下會收集附近的AP信息,並將這些信息發送到位置服務器,服務器檢索出每個AP的位置信息,並根據每個信號的強弱程度計算出設備的大概位置。
    • GPS定位. GPS定位類似於基站定位,在地球上方大概有24顆GPS衛星,這些衛星通過光信息,再經過複雜的數學運算,來確定GPS芯片的位置。
  2. GPS定位的API

    public class MainActivity extends Activity implements LocationListener {
        private LocationManager lm;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        }
        @Override
        protected void onResume() {
            super.onResume();
            /**
             * @param provider 使用的定位服務類型
             * @param minTime 最小更新定位時間間隔,單位爲毫秒
             * @param minDistance 最小更新定位距離間隔,單位爲米
             * @param listener 監聽器
             */
            String provider = LocationManager.GPS_PROVIDER;
            long minTime = 0;
            float minDistance = 0;
            lm.requestLocationUpdates(provider, minTime, minDistance, this);
        }
        @Override
        public void onLocationChanged(Location location) {
            // 經度
            double longitude = location.getLongitude();
            // 緯度
            double latitude = location.getLatitude();
            System.out.println(
                    "onLocationChanged:" + ",longitude:" + longitude + ",latitude:" + latitude);
        }
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            System.out.println("onStatusChanged:");
        }
        @Override
        public void onProviderEnabled(String provider) {
            System.out.println("onStatusChanged:");
        }
        @Override
        public void onProviderDisabled(String provider) {
            System.out.println("onStatusChanged:");
        }
        @Override
        protected void onPause() {
            super.onPause();
            // 取消監聽, 節約資源
            lm.removeUpdates(this);
        }
    }
    

需求 : 火星座標的轉換

  • 使用方法:
    1. 拷貝axisoffset.dat文件到工程
    2. 模板代碼

    3. try {
      // 獲取實例
      ModifyOffset instance = ModifyOffset.getInstance(new FileInputStream(“axisoffset.dat”));
      // 創建座標點
      PointDouble pt = new PointDouble(22.458054, 114.142257);
      // 火星座標轉標準座標
      PointDouble c2s = instance.c2s(pt);
      // 標準座標轉火星座標
      PointDouble s2c = instance.s2c(pt);
      } catch (Exception e) {
      e.printStackTrace();
      }

通過經緯度獲得位置信息

  • 需求 : 將獲取的經緯度轉換爲真實地址, 展現給用戶
  • 實現 : 通過網絡API來實現
  • 代碼 :

    public class GPSService extends Service implements LocationListener {
        private LocationManager lm;
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
        @Override
        public void onCreate() {
            super.onCreate();
            lm = (LocationManager) getSystemService(LOCATION_SERVICE);
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        }
        // 位置發生變化的回調
        @Override
        public void onLocationChanged(Location location) {
            // 獲取經緯度
            double longitude = location.getLongitude();
            double latitude = location.getLatitude();
            new Thread(new GetLocationRunnable(longitude, latitude)).start();
        }
        class GetLocationRunnable implements Runnable {
            private double longitude;
            private double latitude;
            private String location;
            public GetLocationRunnable(double longitude, double latitude) {
                this.longitude = longitude;
                this.latitude = latitude;
            }
            // http://lbs.juhe.cn/api/getaddressbylngb?lngx=116.407431&lngy=39.914492
            @Override
            public void run() {
                InputStream is = null;
                BufferedReader br = null;
                try {   
                    URL url =
                            new URL("http://lbs.juhe.cn/api/getaddressbylngb?lngx="
                                    + longitude + "&lngy=" + latitude);
                    HttpURLConnection conn =
                            (HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(30 * 1000);
                    conn.setReadTimeout(30 * 1000);
                    conn.connect();
                    if (conn.getResponseCode() == 200) {
                        is = conn.getInputStream();
                        br = new BufferedReader(new InputStreamReader(is));
                        String result = "";
                        String temp = "";
                        while ((temp = br.readLine()) != null) {
                            result += temp;
                        }
                        JSONObject resultJson = new JSONObject(result);
                        JSONObject rowJson = resultJson.getJSONObject("row");
                        JSONObject resJson = rowJson.getJSONObject("result");
                        location = resJson.getString("formatted_address");
                    } else {
                        location = "獲取失敗";
                    }
                } catch (Exception e) {
                    location = "獲取失敗";
                } finally {
                    StreamUtils.close(br);
                    StreamUtils.close(is);
                }
                // 安全號碼
                String savedSafeNum =
                        SPUtils.getString(GPSService.this, Constants.SAFE_NUM);
                if (TextUtils.isEmpty(savedSafeNum)) {
                    stopSelf();
                    return;
                } else {
                    SmsManager manager = SmsManager.getDefault();
                    manager.sendTextMessage(savedSafeNum, null, "經度:" + longitude
                            + ",緯度:" + latitude + ",真實地址:" + location, null, null);
                    stopSelf();
                }
            }
        }
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
        @Override
        public void onDestroy() {
            super.onDestroy();
            lm.removeUpdates(this);
        }
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章