顯示具有 Example 標籤的文章。 顯示所有文章
顯示具有 Example 標籤的文章。 顯示所有文章

2013年11月1日 星期五

[Android][Example] 用SoundPool控制左右聲道

如果需要控制左右聲道的音量,SoundPool有提供這個功能
SoundPool的優點是可以同時撥好幾個音檔
但卻對音檔的大小有限制
因此只適合撥較短的音檔

以下範例UI會有左右聲道的播放及停止按鈕





activity_main.xml


    

        

        

    

        

        



MainActivity.java
package com.qn.leftrightsound;

import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    private String TAG = "leftrightsound";
    private SoundPool soundPool;
    private Button button_left_play, button_left_pause, button_right_play, button_right_pause;
    private int music_left, music_right;
    private int music_left_temp, music_right_temp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        music_left = soundPool.load(this, R.raw.left_sound, 1);
        music_right = soundPool.load(this, R.raw.right_sound, 1);
        // 音樂檔案放在res/raw底下,預設沒有raw資料夾,要自己建

        button_left_play = (Button) findViewById(R.id.button_left_play);
        button_left_pause = (Button) findViewById(R.id.button_left_pause);
        button_right_play = (Button) findViewById(R.id.button_right_play);
        button_right_pause = (Button) findViewById(R.id.button_right_pause);

        button_left_play.setOnClickListener(ButtonListner);
        button_left_pause.setOnClickListener(ButtonListner);
        button_right_play.setOnClickListener(ButtonListner);
        button_right_pause.setOnClickListener(ButtonListner);
    }

    private Button.OnClickListener ButtonListner = new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button_left_play:
                Log.i(TAG, "press left play");
                music_left_temp = soundPool.play(music_left, 1, 1, 0, 0, 1);
                // 由於每次播放的id會不同,為考慮到按下暫停是要暫停剛剛播放的,因此將每次播放的id存起來
                // play()
                // 第一參數為音檔id
                // 第二.三參數為左右聲道的音量,range = 0.0 to 1.0
                // 第四參數為優先權,若不需設定可都設為0,0為最小優先權
                // 第五參數為loop,0 = no loop, -1 = loop forever
                // 第六參數為速度,1.0 = normal playback, range 0.5 to 2.0
                break;
            case R.id.button_left_pause:
                Log.i(TAG, "press left pause");
                soundPool.stop(music_left_temp);
                 break;
            case R.id.button_right_play:
                Log.i(TAG, "press right play");
                music_right_temp = soundPool.play(music_right, 0, 1, 0, 0, 1);
                break;
            case R.id.button_right_pause:
                Log.i(TAG, "press right pause");
                soundPool.stop(music_right_temp);
                break;
            }
        }
    };

    @Override
    protected void onDestroy() {
        this.soundPool.release();
         super.onPause();
    }

}

2012年6月20日 星期三

[Example] [Android] [JAVA] JNI & NDK應用_BMI

JNI & NDK應用_BMI
JNI會將使用者輸入的身高體重傳到C
真正計算是由C來實作
C會將算完的答案回傳到JAVA
JAVA再將其顯示在UI上

流程方法
藉由java撰寫native method,JNI即可在Java中呼叫C寫的程式
C的程式藉由NDK包成.so檔,就可以被JNI呼叫

程式流程
1). (java) 撰寫native method,不需實做

2). 將寫好的.java檔,編成.class檔,再轉成.h檔

3). (C) 撰寫C程式碼,實做.h中的function標頭

4). 撰寫NDK需要的Android.mk

5). 利用NDK將C程式碼轉成.so檔

6). (java) 利用JNI呼叫C的程式















//=============================================================
[Main.java]
package com.jni;

import java.text.DecimalFormat;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Main extends Activity {
 double height, weight;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  Button button = (Button) findViewById(R.id.button_submit);
  button.setOnClickListener(calbmi);

 }

 private OnClickListener calbmi = new OnClickListener() {

  @Override
  public void onClick(View v) {
   DecimalFormat nf = new DecimalFormat("0.00");
   EditText fieldheight = (EditText) findViewById(R.id.edit_height);
   EditText fieldweight = (EditText) findViewById(R.id.edit_weight);
   
   try {
    height = Double.parseDouble(fieldheight.getText().toString());
    weight = Double.parseDouble(fieldweight.getText().toString());
   } catch (NumberFormatException e) {
    // Toast.makeText(v.getContext(),
    // "Please submit height and weight.", Toast.LENGTH_LONG)
    // .show();
    openOptionsDialog();
   }

   if (height == 0 || weight == 0) {
    openOptionsDialog();
   } 
   else {
    TextView bmi = (TextView) findViewById(R.id.text_result);
    double bmi_value = new Bmi().calbmi(height, weight);
    bmi.setText("Your BMI is " + nf.format(bmi_value));
   }
  }
 };

 private void openOptionsDialog() {
  AlertDialog.Builder dialog = new AlertDialog.Builder(Main.this);
  dialog.setTitle(R.string.dialog_title);
  dialog.setMessage(R.string.dialog_msg);
  dialog.setPositiveButton(R.string.dialog_btn,
    new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialoginterface, int i) {
     }
    });
  dialog.show();
 }


}


[Bmi.java]
package com.jni;

public class Bmi {
 public native String stringFromJNI();
 public native double calbmi(double height, double weight);
 static{
  System.loadLibrary("cal_bmi_c");
 }
}




參考資料:
[Android] [JAVA] JNI & NDK

2012年5月24日 星期四

[Example] [Android] [JAVA] Android APP應用2

















按了button觸發啟動Service,顯示Toast並延遲兩秒啟動Notification
按下Notification進入到另外一個Activity
此可以列出device跟sw的資訊

參考文章: