アプリで音声ファイルを再生する

まず、am02.mp3という音声ファイルがあったとします。
[res]フォルダ内に[raw]フォルダを作成して、その中にmp3を置いてください。

Activity内の任意の場所に、下記のコードを追加してください。

Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.am02);

//音量設定を取得
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int Vol = am.getStreamVolume(AudioManager.STREAM_MUSIC); //[res]-[raw]の音源を再生するときの音量
int max = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //[res]-[raw]の音源を再生するときの最大音量
System.out.println("Vol:" + Vol);
System.out.println("max:" + max);
//音量を上げる
am.setStreamVolume(AudioManager.STREAM_MUSIC, max, 0);

MediaPlayer mp = MediaPlayer.create(context, uri);
mp.start();

と、書き込むと、am02ファイルが鳴ります!

そんな都合よく音声ファイルなんてないよ!って方は、端末のデフォルト音を使いましょう。
最初のUri指定を、

Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); // アラーム音

に変更するだけです!

AndroidアプリでカスタムURLスキームを設定する

AndroidアプリにカスタムURLスキームを設定すると、独自のURLリンクからアプリを起動することができるようになります。
また、パラメータをつけておくことで、それをキーとして認識させ、アプリを起動した後に任意の動作をさせることも可能です。

ポイントは、マニフェストファイルに下記の要領で設定を追加すること。
1つのactivityタグの中には、複数のを持つことができます。

android.intent.action.MAIN
の部分に関しては、最初にプロジェクトを作成すると自動で記述されます。
action android:name=”android.intent.action.VIEW”
を追加して、カスタムURLを設定しましょう。

[AndroidManifest.xml]

	<application
		android:icon="@drawable/icon"
		android:label="@string/app_name">
		<activity android:name=".FirstActivity" android:label="@string/app_name"
			android:screenOrientation="portrait">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
        
			<intent-filter>
				<action android:name="android.intent.action.VIEW" />

				<category android:name="android.intent.category.DEFAULT" />
				<category android:name="android.intent.category.BROWSABLE" />
				<data android:scheme="myapp" />
			</intent-filter>
		</activity>
      
		<activity android:name=".SecondActivity" android:label="@string/app_name"
			android:screenOrientation="portrait">
		</activity>
      ・
      ・
      ・

ビルドしたらWebViewの挙動が変わった件について

前回の記事で、WebViewでファイル選択ができるようになりました。
開発時の実機確認オッケー! よし、ビルドしてAPKにしよう!!
と意気揚々と署名付きAPKファイルをつくりました。DeployGateにあげて確認してみると、なんとまたファイル選択が無効になっているではありませんか!!
ソースには問題がないのに、開発時は動いてビルド後は動かなくなったという現象が発生したのです。

実際にログも変わっていて、
[開発時]

V/webkit(18387): BrowserFrame hapticMouseClickEvent:  Element: INPUT Value:  Element type: file

[ビルド後]

V/webkit(18490): BrowserFrame hapticMouseClickEvent:  Element: A 	 Value:  Element type:

というログメッセージが、formボタンを押したときに表示されました。
Element情報とtype情報がごっそり無くなっています。

かなり悩みましたが、原因を特定できました。
アプリビルド時にソースを暗号化するツール、プロガードのせいでした。
しっかり検証していませんが、プロガードが暗号化する際に、一部のソースを正確に反映していなかったようです。

プロガードを無効にしたら、ビルド後もちゃんと期待通りの動作をするようになりました!!

WebViewでファイル選択機能を有効にする

WebViewで見ているページで、formのファイル選択ボタンがあったとします。
Android端末の中に保存している画像の選択をするには、ちょっと普段と違った実装をしなくてはなりません。
普通に実装しているだけでformボタンが無効化されてしまいます。

public class WebActivity extends Activity {
	//エコー写真のファイル送信を可能にする
	final private int INTENT_CODE = 101;
	private ValueCallback<Uri> mUploadMessage;

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

		// WebViewインスタンスを取得
		WebView webView = (WebView) findViewById(R.id.webView);

		// WebViewの設定
		webView.getSettings().setUseWideViewPort(true);
		webView.getSettings().setLoadWithOverviewMode(true);
		webView.setVerticalScrollbarOverlay(true);
		webView.getSettings().setBuiltInZoomControls(true);
		webView.getSettings().setDomStorageEnabled(true);
		webView.getSettings().setJavaScriptEnabled(true);
		webView.loadUrl(url);

		// WebViewClientを継承
        webView.setWebChromeClient(new WebChromeClient() {
        	// /Android 4.1以上
        	public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
				mUploadMessage = uploadMsg;
				Intent i = new Intent(Intent.ACTION_GET_CONTENT);
				i.addCategory(Intent.CATEGORY_OPENABLE);
				i.setType("image/*");
				startActivityForResult(Intent.createChooser(i, "画像選択"), INTENT_CODE);
			}
			// Android 3.0以上
			public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
				mUploadMessage = uploadMsg;
				Intent i = new Intent(Intent.ACTION_GET_CONTENT);
				i.addCategory(Intent.CATEGORY_OPENABLE);
				i.setType("image/*");
				startActivityForResult(Intent.createChooser(i, "画像選択"), INTENT_CODE);
			}
			// Android 3.0未満
			public void openFileChooser(ValueCallback<Uri> uploadMsg) {
				openFileChooser(uploadMsg, "", "");
			}
        });
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
		if (requestCode == INTENT_CODE) {
			if (null == mUploadMessage) return;

			Uri result = (intent == null || resultCode != RESULT_OK)  ? null : intent.getData();
			mUploadMessage.onReceiveValue(result);
			mUploadMessage = null;
		}
	}

WebViewで端末のバックキーの挙動を変える

AndroidアプリでWebViewを使っているとき、「前のページに戻りたいなー」って思ってデフォルトのブラウザと同じようにバックキーを押しちゃうと、Activityが終了しちゃってWebViewが閉じちゃうことってありますよね。

それを防ぐコードは下記のようになります。
バックキーを押したときに、ページを読み進めていれば、前のページに戻る。最初に開いたページまで戻っていれば、Activity終了という風に処理分けしています。

	// 端末の戻るボタンを押した時に前のページに戻す
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// ページを進んでいたら
		if (event.getAction() == KeyEvent.ACTION_DOWN
				&& keyCode == KeyEvent.KEYCODE_BACK
				&& webView.canGoBack() == true) {
			ReturnPage();
			return true;
		}
		// トップページならActivity終了
		else {
			Finish();
			return true;
		}
	}

	private void ReturnPage() {
		webView.goBack();
	}

	private void Finish() {
		finish();
	}

※改稿しました
WebViewで端末のバックキーの挙動を変える 改

Top