質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2462閲覧

Java Androidでアクティビティの呼び出し (Activityから実行する処理!?)

kt.tk.co

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/06/05 01:13

編集2016/06/05 01:54

現在、Androidアプリを作ろうとしています。
ネットにあるサンプルコードの継ぎ接ぎばかりなので、理解していない部分が多い状態です。

現在、Box2dという物理演算ライブラリを使っており、
物体が衝突する → 他のアプリが起動する
という動作をさせようとしています。

javaファイルは大まかに、以下の3つです。
0. Activity.java : 起動時の処理や、メニューの定義
0. World.java : ワールドや物体を定義する
0. ContactListener.java : 「World.java」に登録しており、物体が衝突して場合に実行される。

この時、問題として、物体衝突を判定するための
ContactListener.java
から、他のアプリを起動する下記の処理が実行できません。

コードのエラー

  1. PackageManager pm = getPackageManager();
    • リストgetPackageManager() は型 MyContactListener で未定義です
  2. startActivity(intent);
    • getPackageManager() は型 MyContactListener で未定義です
  3. Toast.makeText(this, "対象のアプリがありません", Toast.LENGTH_SHORT).show();
    • 型 Toast のメソッド makeText(Context, CharSequence, int) は引数 (MyContactListener, String, int) に適用できません

(Activityのある場所で実行すれば問題なく他のアプリを起動出来ます。)

Java

1 //他のアプリケーションを実行する 2 public void StartOtherApp() { 3 4 //アプリを指定して起動 5 PackageManager pm = getPackageManager(); 6 Intent intent = pm.getLaunchIntentForPackage("com.google.android.gm"); 7 startActivity(intent); 8 9 try { 10 startActivity(intent); 11 } catch (Exception e) { 12 Toast.makeText(this, "対象のアプリがありません", Toast.LENGTH_SHORT).show(); 13 } 14 15 }

恐らく、Activityから実行しなければいけないものだと推測していますが、どのように書き換えたらよいのか理解できておりません。
(Toastによる文字出力などもActivityから実行する必要がありますよね?)

基礎的なことだと思うのでお恥ずかしいですが、お力を貸して頂けますと幸いです。
何卒よろしくお願いします。

(Activityに上記の処理を書いて、ContactListenerから呼びだそうとしても呼び出せないのですね。)

java

1//ContactListener.java 2 3public class MyContactListener implements ContactListener { 4 5 public void beginContact(Contact contact) { 6 System.out.println("衝突が起きました"); 7 ////////////////////////////////// 8 //ここで他のアプリを起動したい! 9 ////////////////////////////////// 10 } 11 12 public void endContact(Contact contact) { 13 System.out.println("離れました"); 14 } 15 16 public void postSolve(Contact contact, ContactImpulse arg1) { 17 // TODO 自動生成されたメソッド・スタブ 18 19 } 20 21 public void preSolve(Contact contact, Manifold arg1) { 22 // TODO 自動生成されたメソッド・スタブ 23 24 } 25} 26

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでいいのでは?
コンパイル・動作確認していません。

java

1public class MyContactListener implements ContactListener { 2 private final Context context; 3 public MyContactListener(Context context) { 4 this.context = context; 5 } 6 public void beginContact(Contact contact) { 7 System.out.println("衝突が起きました"); 8 ////////////////////////////////// 9 //ここで他のアプリを起動したい! 10 ////////////////////////////////// 11 } 12 13 public void endContact(Contact contact) { 14 System.out.println("離れました"); 15 } 16 17 public void postSolve(Contact contact, ContactImpulse arg1) { 18 // TODO 自動生成されたメソッド・スタブ 19 20 } 21 22 public void preSolve(Contact contact, Manifold arg1) { 23 // TODO 自動生成されたメソッド・スタブ 24 25 } 26 27 public void StartOtherApp() { 28 29 //アプリを指定して起動 30 PackageManager pm = context.getPackageManager(); 31 Intent intent = pm.getLaunchIntentForPackage("com.google.android.gm"); 32// context.startActivity(intent); 33 34 try { 35 context.startActivity(intent); 36 } catch (Exception e) { 37 Toast.makeText(context, "対象のアプリがありません", Toast.LENGTH_SHORT).show(); 38 } 39 40 } 41}

投稿2016/06/05 01:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt.tk.co

2016/06/05 01:57

ご回答頂きありがとうございます。 コードを拝見し、実際に試してみましたがうまく行きませんでした。 また、私自身の質問を見直し、エラーメッセージなどの記述が少ない点を反省しました。 ただいま画像とエラーメッセージを追加しましたので、再度お力添え頂けますと幸いです。 エラーメッセージが出る部分は、Activity.javaであれば問題なく実行できます。 私が「継承」などをイマイチ理解しておらず、使いこなせていないことが原因のようです。 取り急ぎご回答にお礼申し上げます。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2016/06/05 04:01

getPackageManager()や、startActivity()はContextのメンバメソッドです。 そして、ActivityはContextを継承しているクラスです。ざっくりと簡単に言うと、「ActivityはContext(の一種)である」といえる関係です。 ですから、getPackageManager()を呼出したりする時には、対象のオブジェクト(Context)を指定しなければなりません。 ただし、自オブジェクトのメンバーは対象オブジェクトを指定しなくても呼出すことができます。 つまり、ただの 「getPackageManager()」 の呼出は、「this.getPackageManager()」の意味です。StartOtherApp() がActivityの中にあるときは大丈夫で、他のクラスに移動したらダメというのは、この「this」がActivityではなくなってしまうからです。 他のクラスで処理を行う際にはContextをそのクラスに渡し、そのContextのメンバメソッドを呼出す必要があります。
kt.tk.co

2016/06/05 08:41

ありがとうございました!! 解決しました。 ご指摘の通り、Contextを継承することで当初の目的通りの動作を実行できました!! 初めにご指摘頂いた通りにコードを変更出来ていなかった点でも問題を複雑化してしまい失礼しました。 (こちらにコードを載せる際には不要なコメントアウトや未使用の変数を削除していたため、頂いたコードをコピペで実行できずに変更箇所を探して反映させていたため。) とてもわかり易く解説いただき、ActivityやContextの概要が理解できました! その後、ネットでContextを調べた結果、 Activity.java → World.java → ContactListener.java とContextを引き継ぐことで実行することが出来ました。 norihiro様には貴重なお時間を頂いただけでなく、わかりやすい説明をして頂き非常に感謝しております。 まだまだわからないことだらけの初心者にも関わらず、懇切丁寧にご指導いただきありがとうございました。 またの機会がございましたらよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問