Intentを使って地図を呼び出す
概要
Intentを使って、作成したアプリから地図(Googleマップ)を呼び出す方法です。
地図を呼び出して、指定した位置が表示されるようにします。
ソースコードは以下になります。
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); // 東京スカイツリーへ移動 intent.setData(Uri.parse("geo:35.710594, 139.810947?z=17")); startActivity(intent);
地図に移動する場所を指定するのは
geo:35.710594, 139.810947
というのは緯度、経度になります。
ブラウザーを呼び出すには
指定したURLに移動する
この方法はデフォルトのブラウザが呼び出され、指定したURLのページに移動する
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.yahoo.co.jp")); startActivity(intent);
ブラウザを選択してから、検索を行う
Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); // 検索文字列は第2引数に入れる intent.putExtra(SearchManager.QUERY, "android"); startActivity(intent);
Androidでアプリ起動時にスプラッシュ画面を表示する
iOSアプリのように起動時に画像が表示されるようにしたいときは
Androidでは仕組みが用意されていませんので自前で作成するしかありません。
そこで今回はAndroidでのスプラッシュ画面を表示する方法を書きたいと思います。
起動してスプラッシュ用のレイアウト画面を表示した後、
一定時間経つとメイン画面へ自動的に移動するようにします。
準備
スプラッシュ用の画面を用意する
はじめにレイアウトファイルを作成します。
android用のレイアウトファイルを新規に作成します。
(仮にここでは/res/layout/splash.xmlを作成するとします。)
ここでは起動時に表示したい画像や、文章を用意します。
スプラッシュ用のアクティビティ(Activity)を作成する
続いて作成したレイアウトファイルを表示させるためのアクティビティクラスを作成します。
Activityを継承したクラスを作成します(ここではSplashActivity.javaとします)
そしてアクティビティが起動されるときに呼び出されるonCreate()
に先ほど作成したスプラッシュ用レイアウトファイルを読み込むようにします。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // スプラッシュ用のビューを取得する setContentView(R.layout.splash_view);
続いて
一定時間が経つとアクティビティを終了し、
別のアクティビティに移動する処理を追加します
Handler.postDelayed()を使用します。
// 2秒したらMainActivityを呼び出してSplashActivityを終了する Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // MainActivityを呼び出す Intent intent = new Intent(getApplicationContext(), MainActivity.class); // アクティビティ(MainActivity)を起動する startActivity(intent); // SplashActivityを終了する SplashActivity.this.finish(); } }, 2 * 1000); // 2000ミリ秒後(2秒後)に実行
スプラッシュ用アクティビティをはじめに起動するようにする
一番はじめにSplashActivityを起動して、その後にMainActivityを起動するようにするには
AndroidManifest.xmlに設定をしなければなりません。
まずはAndroidでアプリ起動時に、一番最初に呼ばれるアクティビティは
activityタグ内に
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
が書かれているアクティビティになります。
またフルスクリーンで表示するには以下のパラメータが必要になります。
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"
<!-- スプラッシュ画像用のアクティビティ --> <activity android:name="com.example.splashviewsample.SplashActivity" android:configChanges="orientation|screenSize" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
そしてスプラッシュ画面の次に呼び出されるアクティビティはこのように記述します。
<!-- スプラッシュ後のアクティビティ --> <activity android:name="com.example.splashviewsample.MainActivity" />
ソースコード
SplashActivity.java
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.widget.ImageView; import android.widget.ImageView.ScaleType; public class SplashActivity extends Activity { Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // スプラッシュ用のビューを取得する setContentView(R.layout.splash_view); // 2秒したらMainActivityを呼び出してSplashActivityを終了する mHandler.postDelayed(new Runnable() { @Override public void run() { // MainActivityを呼び出す Intent intent = new Intent(getApplicationContext(), MainActivity.class); startActivity(intent); // SplashActivityを終了する SplashActivity.this.finish(); } }, 2 * 1000); // 2000ミリ秒後(2秒後)に実行 } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.splashviewsample" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- スプラッシュ画像用のアクティビティ --> <activity android:name="com.example.splashviewsample.SplashActivity" android:configChanges="orientation|screenSize" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- スプラッシュ後のアクティビティ --> <activity android:name="com.example.splashviewsample.MainActivity" /> </application> </manifest>
カメラがついているか確認する
PackageManagerをつかうとその機種にカメラがついているかや、
Bluetooth、NFCかついているかを確認することができます。
今回はカメラがあるかをチェックするソースです。
// カメラがあるかないかチェックする Context context = getActivity(); PackageManager packageManager = context.getPackageManager(); if(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA) == false){ Toast.makeText(getActivity(), "This device does not have a camera.", Toast.LENGTH_SHORT) .show(); return; }
参考にしたサイト
画像をタップすると拡大表示する(Activity編)
今度はActivityを使って画面をタップしたときの拡大表示をやってみたいと思います。
ソースコード
MainActivity.java
package com.example.galleryviewsample3; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { // どこで呼び出したのかを判別するためのコード private static final int RESULTCODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = (ImageView)findViewById(R.id.imageView1); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 画像をクリックすると画像拡大アクティビティを呼び出す Intent intent = new Intent(getApplicationContext(), ExpandImageViewActivity.class); startActivityForResult(intent, RESULTCODE); } }); } /** * 他のActivityから戻ってきたときの処理 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == RESULTCODE && resultCode == RESULT_OK){ Toast.makeText(this, "元の画面に戻ってきた", Toast.LENGTH_SHORT).show(); } } }
ExpandImageViewActivity.java
package com.example.galleryviewsample3; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View.OnClickListener; import android.view.View; import android.view.Window; import android.widget.ImageView; public class ExpandImageViewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // タイトルバーを非表示にする(setContentViewの前に呼ぶ) requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.expand_image_view); ImageView imageView = (ImageView)findViewById(R.id.expandImageView); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 拡大した画像をタップするともとの画面に戻る Intent intent = new Intent(); setResult(RESULT_OK, intent); finish(); } }); } }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="166dp" android:src="@drawable/ic_launcher" /> </RelativeLayout>
expand_image_view.xml
<?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" > <ImageView android:id="@+id/expandImageView" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/ic_launcher" /> </LinearLayout>
画像をタップすると拡大表示する(ダイアログ編)
ギャラリーアプリを作成する場合、画像をタップしたら拡大表示する機能をつけたいと思うはずです。
今回のサンプルは画像アイコンをタップすると、
ダイアログ表示されその中で画像が拡大表示されるというものです。
起動時の画面
タップしてダイアログが表示された画面
MainActivity.java
// レイアウトオブジェクトから拡大対象のImageViewを取得 final ImageView tapView = (ImageView)findViewById(R.id.imageView1); // 拡大対象のImageViewにタップ時のリスナーをセット tapView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ImageView imageView = new ImageView(MainActivity.this); Bitmap bitmap = ((BitmapDrawable)tapView.getDrawable()).getBitmap(); imageView.setImageBitmap(bitmap); // ディスプレイの幅を取得する(API 13以上) Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; float factor = width / bitmap.getWidth(); imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); // ダイアログを作成する Dialog dialog = new Dialog(MainActivity.this); // タイトルを非表示にする dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(imageView); dialog.getWindow().setLayout((int)(bitmap.getWidth()*factor), (int)(bitmap.getHeight()*factor)); // ダイアログを表示する dialog.show(); } });
ソースコード
package com.example.galleryviewsample; import android.os.Bundle; import android.app.Activity; import android.app.Dialog; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.drawable.BitmapDrawable; import android.view.Display; import android.view.View; import android.view.Window; import android.widget.ImageView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // レイアウトオブジェクトから拡大対象のImageViewを取得 final ImageView tapView = (ImageView)findViewById(R.id.imageView1); // 拡大対象のImageViewにタップ時のリスナーをセット tapView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ImageView imageView = new ImageView(MainActivity.this); Bitmap bitmap = ((BitmapDrawable)tapView.getDrawable()).getBitmap(); imageView.setImageBitmap(bitmap); // ディスプレイの幅を取得する(API 13以上) Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; float factor = width / bitmap.getWidth(); imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); // ダイアログを作成する Dialog dialog = new Dialog(MainActivity.this); // タイトルを非表示にする dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(imageView); dialog.getWindow().setLayout((int)(bitmap.getWidth()*factor), (int)(bitmap.getHeight()*factor)); // ダイアログを表示する dialog.show(); } }); } }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="136dp" android:src="@drawable/ic_launcher" /> </RelativeLayout>