私は自分のために言語辞書アプリを書いています(一種のAndroidプログラミング学習演習として)。
自分のアプリを他のアプリのインテントチューザーのオプションとしてリストしたいので、次のコード行をマニフェストに追加します。
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
私のアプリは他のアプリ(ブラウザなど)のアクションメニューに正常に表示されます。これは良いことです。ブラウザのアクションメニューからアプリを選択すると、共有を介してアプリが正常に呼び出されます。
ここで、自分のアプリが他のアプリから送信されたテキスト(単語)を受信して処理し、その定義についてテキストを自動的に検索するようにします。アプリのメインアクティビティに次のコード行を追加します。
//(under onCreate)
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
EditText edittext = (EditText) findViewById(R.id.edWord);
if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null) {
edittext.setText(sharedText);
}
}
}
ただし、この段階では、共有を介してアクションメニューからアプリを選択するたびにブラウザがクラッシュします。
だから私の質問になります:
- 私は何を間違えましたか?
- アプリが他のアプリからのテキストを受け入れるように「強制」し、その定義を自動的に表示するにはどうすればよいですか?
申し訳ありませんが、これらは初心者の質問です(私の頭痛の種ですが)。
ご助力ありがとうございます。
更新1
ありがとう、CommonWare。ブラウザがクラッシュしても何も生成されませんが、アプリのWebビューから[共有]を選択すると、次のログ猫が表示されます。
08-09 18:17:23.726: W/dalvikvm(1111): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
08-09 18:17:23.776: E/AndroidRuntime(1111): FATAL EXCEPTION: main
08-09 18:17:23.776: E/AndroidRuntime(1111): java.lang.RuntimeException: Unable to start activity ComponentInfo{peter.kadict/peter.kadict.Kadict}: java.lang.NullPointerException
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.access$600(ActivityThread.java:122)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.os.Handler.dispatchMessage(Handler.java:99)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.os.Looper.loop(Looper.java:137)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.main(ActivityThread.java:4340)
08-09 18:17:23.776: E/AndroidRuntime(1111): at java.lang.reflect.Method.invokeNative(Native Method)
08-09 18:17:23.776: E/AndroidRuntime(1111): at java.lang.reflect.Method.invoke(Method.java:511)
08-09 18:17:23.776: E/AndroidRuntime(1111): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-09 18:17:23.776: E/AndroidRuntime(1111): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-09 18:17:23.776: E/AndroidRuntime(1111): at dalvik.system.NativeStart.main(Native Method)
08-09 18:17:23.776: E/AndroidRuntime(1111): Caused by: java.lang.NullPointerException
08-09 18:17:23.776: E/AndroidRuntime(1111): at peter.kadict.Kadict.onCreate(Kadict.java:449)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.Activity.performCreate(Activity.java:4465)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-09 18:17:23.776: E/AndroidRuntime(1111): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
08-09 18:17:23.776: E/AndroidRuntime(1111): ... 11 more
更新2
このコードはCommonsWareのおかげで問題を解決しました。
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null) {
setContentView(R.layout.main);
EditText edittext = (EditText) findViewById(R.id.edWord);
edittext.setText(sharedText);
}
}
}
ただし、そのタスクは実行されません。アプリは読み込まれますが、他のアプリから送信されたテキスト(単語)を受信して処理していないようです。
助けてくれませんか?どうもありがとう。