2013年04月24日

【Android】アプリから他のアプリを起動する方法

前回はAndroidにおけるデータ永続化処理【データベース編】を紹介したが、今回は自作アプリから他のアプリを呼び出す方法を紹介したいと思う。

Android端末にはブラウザや電話アプリ、地図アプリ、メールアプリ、カレンダーアプリなどなど、普通は様々なアプリがデフォルトでインストールされているのだが、今回はそれらのアプリを自作アプリから呼び出してみる。

以下は、自作アプリから「ブラウザ」アプリを起動するサンプルである。

まずはメッセージリソース。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="button_invoke_other_app">ブラウザアプリを呼び出す</string>
</resources>

次に画面レイアウト。

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="invokeOtherApp"
            android:text="@string/button_invoke_other_app" />
    </LinearLayout>

</LinearLayout>

そしてアクティビティ本体。

MainActivity.java
package com.example.myfirstapp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

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

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	/**
	 * 他アプリ(ブラウザアプリ)を呼び出す
	 * 
	 * @param view
	 */
	@SuppressLint("ShowToast")
	public void invokeOtherApp(View view) {
		// インテント作成
		Uri uri = Uri.parse("http://www.android.com");
		Intent intent = new Intent(Intent.ACTION_VIEW, uri);

		// パッケージマネージャからブラウザアプリを探す
		PackageManager packageManager = getPackageManager();
		List<ResolveInfo> activities = packageManager.queryIntentActivities(
				intent, 0);
		boolean isIntentSafe = activities.size() > 0;

		if (isIntentSafe) {
			startActivity(intent);
		} else {
			// ブラウザアプリが未インストールの場合
			Toast.makeText(this, "The App Not Found", Toast.LENGTH_LONG).show();
		}
	}

}

どのアプリを呼び出すかのポイントとなるのは、#invokeOtherApp内の「インテント作成」の部分である。
Uri uri = Uri.parse("http://www.android.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

上はブラウザアプリを呼び出す例だが、もし電話アプリを呼び出したいときは、以下のようにコーディングする。
Uri uri = Uri.parse("tel:5551234");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);

さらに地図アプリ。
Uri uri = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

さらにさらにメールアプリ。
Intent intent = new Intent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
intent.setType(HTTP.PLAIN_TEXT_TYPE);
intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
intent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
intent.putExtra(Intent.EXTRA_TEXT, "Email message text");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris

トドメはカレンダーアプリだ。
Intent intent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
intent.putExtra(Events.TITLE, "Ninja class");
intent.putExtra(Events.EVENT_LOCATION, "Secret dojo");


どのアプリを起動するかをユーザに選ばせたいときは以下のようにコーディングする。この例ではブラウザが複数インストールされていることを前提で、使いたいブラウザをユーザに選ばせている。
// Build the intent
Uri uri = Uri.parse("http://www.android.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
String title = (String) getResources().getText(R.string.chooser_title);
// Create and start the chooser
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);
posted by 寄り道退屈男 at 13:54 | Comment(0) | TrackBack(0) | Android
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/65406751
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック