Re: [Android-SDK-Japan:2800] アプリケーション上でのIMEの切り替え操作について質問です

1,150 views
Skip to first unread message

Keiji Ariyama

unread,
Feb 19, 2013, 6:42:22 AM2/19/13
to android-...@googlegroups.com
有山と申します。

>> デバック でソースを追ってみると [switchInputMethod関数]を
>> 呼び出しているところで強制終了(LogCatのエラー:IllegalStateException)が発生します。
このLogcatに表示されているスタックトレースを、もう少し詳しく記載してもら
えると、何かわかるかも知れません。

(2/19/13 7:53 PM), noko wrote:
> お世話になっております、ノコと申します。
>
> Androidアプリケーション上でのIME切り替えについての質問です。
>
> 通常、IME の切り替えはEditText等の入力欄を長押しすると
> 「入力方法」メニューが表示され、そこから入力方法を選択するようになっているかと思います。
>
> その操作を省略するため画面上に作成したボタンを押すと、BlueToothからの入力へとIMEを変更するアプリケーションを作成するために、
> 下記の記事を参考に実装しましたが、強制終了になってしまいます。
> ↓
> http://d.hatena.ne.jp/yujimny/20120210/1328847164
>
> デバック でソースを追ってみると [switchInputMethod関数]を
> 呼び出しているところで強制終了(LogCatのエラー:IllegalStateException)が発生します。
>
> [switchInputMethod関数] の引数「id」には想定の文字列が入っており、
> AndroidManifestにもIMEserviceの追加をしました。
>
> 原因がわからないまま、3日ほど作業が滞っております。
>
>
> 開発環境は、
> Windows7(64bit)
> Eclipse Indigo(JDK1.5)
>
> 対象OSは、
> Android2.1
> です。
>
> 説明不足でしたら申し訳ございません。
> 少しでも手がかり等ございましたら、ご享受頂けると幸いです。
>

--
Keiji,
ml_an...@c-lis.co.jp

noko

unread,
Feb 19, 2013, 8:29:16 PM2/19/13
to android-...@googlegroups.com
有山様

早々のご回答ありがとうございます。


以下LogCatの内容になります。
[Nyuko.java] から [InputMS.java]を呼び出し、
[InputMS.java] の 18行目で[switchInputMethod関数] を呼び出しております。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
02-20 10:11:28.117: E/AndroidRuntime(4563): Uncaught handler: thread main exiting due to uncaught exception
02-20 10:11:28.167: E/AndroidRuntime(4563): java.lang.IllegalStateException: Could not execute method of the activity
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.View$1.onClick(View.java:2052)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.View.performClick(View.java:2397)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.View.onTouchEvent(View.java:4212)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.widget.TextView.onTouchEvent(TextView.java:6616)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.View.dispatchTouchEvent(View.java:3742)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:981)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:981)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:981)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:981)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:981)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.app.Activity.dispatchTouchEvent(Activity.java:2064)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.os.Looper.loop(Looper.java:123)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.app.ActivityThread.main(ActivityThread.java:4370)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at java.lang.reflect.Method.invokeNative(Native Method)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at java.lang.reflect.Method.invoke(Method.java:521)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:850)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at dalvik.system.NativeStart.main(Native Method)
02-20 10:11:28.167: E/AndroidRuntime(4563): Caused by: java.lang.reflect.InvocationTargetException
02-20 10:11:28.167: E/AndroidRuntime(4563):     at Test.co.jp.manage.Nyuko.onClick1_1(Nyuko.java:77)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at java.lang.reflect.Method.invokeNative(Native Method)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at java.lang.reflect.Method.invoke(Method.java:521)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.view.View$1.onClick(View.java:2047)
02-20 10:11:28.167: E/AndroidRuntime(4563):     ... 22 more
02-20 10:11:28.167: E/AndroidRuntime(4563): Caused by: java.lang.NullPointerException
02-20 10:11:28.167: E/AndroidRuntime(4563):     at android.inputmethodservice.InputMethodService.switchInputMethod(InputMethodService.java:1046)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at Test.co.jp.manage.InputMS.setIME(InputMS.java:18)
02-20 10:11:28.167: E/AndroidRuntime(4563):     at Test.co.jp.manage.Nyuko.changeIME(Nyuko.java:112)
02-20 10:11:28.167: E/AndroidRuntime(4563):     ... 26 more
02-20 10:11:28.177: E/SemcCheckin(4563): Get crash dump level : java.io.FileNotFoundException: /data/semc-checkin/crashdump
02-20 10:11:28.187: I/dalvikvm(4563): threadid=7: reacting to signal 3
02-20 10:11:28.187: E/dalvikvm(4563): Unable to open stack trace file '/data/anr/traces.txt': Permission denied

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

Keiji Ariyama

unread,
Feb 20, 2013, 1:52:25 AM2/20/13
to android-...@googlegroups.com
有山です。

ログを見るかぎり、

>> 02-20 10:11:28.167: E/AndroidRuntime(4563): Caused by:
>> java.lang.NullPointerException
>> 02-20 10:11:28.167: E/AndroidRuntime(4563): at
>> android.inputmethodservice.InputMethodService.switchInputMethod(InputMethodService.java:1046)

と、switchInputMethodにnullが渡っているようなのですが、この周辺
(switchInputMethod)のコードはどのようになっていますか?
--
Keiji,
ml_an...@c-lis.co.jp
Message has been deleted

noko

unread,
Feb 20, 2013, 2:29:17 AM2/20/13
to android-...@googlegroups.com
有山様

お世話になっております、ノコです。
早速のご回答ありがとうございます。

以下レイアウトXML・Javaのソースの一部になります。

<XMLファイルにてイベント発生ボタン[imageButton1]を生成している箇所>
「test.xml」
------------------------------------------------------------------------------------------------------------------
     <ImageButton
         android:id="@+id/imageButton1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:onClick="onClick1"
         android:contentDescription="@string/Button1"
         android:src="@android:drawable/ic_menu_edit" />
        

------------------------------------------------------------------------------------------------------------------
<Javaファイル>
[Nyuko.java]
------------------------------------------------------------------------------------------------------------------
public class Nyuko extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
    }
    // BlueTooth入力
      public void onClick1(View v){
          // IME切り替え
          InputMS ims = new InputMS();
          changeIME();
     }

     // BlueTooth入力への変更処理
      public void changeIME(){;
           InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        List<InputMethodInfo> inputMethodList = manager.getEnabledInputMethodList();
        int i = 0;
        for(InputMethodInfo imi : inputMethodList){
            String nm = (String) inputMethodList.get(i).loadLabel(getPackageManager());
            if(nm.equals("BlueKeyboard JP")){    //切り替えたいIME
                 InputMS ims = new InputMS();      //InputMethodServiceクラスを継承したクラス
                ims.setIME(imi);                             //switchInputMethodの呼び出し
            }
            i++;
         }
     }
}

------------------------------------------------------------------------------------------------------------------
[InputMS.java]
------------------------------------------------------------------------------------------------------------------
public class InputMS extends InputMethodService {
    public void setIME(InputMethodInfo imi){
        this.switchInputMethod(imi.getId());           // imi.getId() の中身にはidとおぼしき文字列が入っておりました
    }
}

------------------------------------------------------------------------------------------------------------------



 [Activityクラス] を継承したクラス[Nyuko.java]から、IME 情報を取得し、
「切り替えたいIMEのパッケージ名」の場合に
[InputMethodServiceクラス] を継承したクラス[InputMS.java]を呼び出し引数 [InputMethodInfo型] を渡して、
て [switchInputMethod関数] にてIMEを変更しようとしましたが、
 [switchInputMethod関数] 呼び出しのところで強制終了(LogCatのエラー:IllegalStateException)が発生します。
 
これは、[InputMethodServiceクラス]にて [switchInputMethod関数] が呼び出せていないということでしょうか。

Keiji Ariyama

unread,
Feb 20, 2013, 2:52:11 AM2/20/13
to android-...@googlegroups.com
有山です。

Activityから実行しているということは、アプリ自体はIMEではないと言うこと
でしょうか?
最初に提示いただいたブログの内容では、「自分がIMEであれば」と記載があ
るので、IMEベースで動作する場合にのみ機能すると言う認識なのですが。

また、

android-platform | How to set default IME in the code
https://groups.google.com/forum/?fromgroups=#!topic/android-platform/E1SD3wpk0X0

このトピックを見る限り、デフォルトのIMEをアプリから変更することは出来な
いようですが、アプリの中限定で使うIMEを動的に変更することは、、、どうな
んでしょうか。

誰か詳しい人が居たら、補足お願いします。
> [Activityクラス] を継承したクラス[Test1.java]から、IME 情報を取得し、
> 「切り替えたいIMEのパッケージ名」の場合に
> [InputMethodServiceクラス] を継承したクラス[InputMS.java]を呼び出し引数 [InputMethodInfo型]
> を渡して、
> て [switchInputMethod関数] にてIMEを変更しようとしましたが、
> [switchInputMethod関数]
> 呼び出しのところで強制終了(LogCatのエラー:IllegalStateException)が発生します。
>
> これは、[InputMethodServiceクラス]にて [switchInputMethod関数] が呼び出せていないということでしょうか。
>

--
Keiji,
ml_an...@c-lis.co.jp

noko

unread,
Feb 20, 2013, 3:13:59 AM2/20/13
to android-...@googlegroups.com
有山様

お世話になっております、ノコです。
迅速なご回答ありがとうございます。

私の説明不足により認識の相違があった様で、、!
お手間をお掛けして大変申し訳ございません。


情報を頂きありがとうございます。
自作アプリケーションからデフォルトのIME 切り替えを行う操作は、権限が無いようですね。

今回は、時間があまりないため別方面から何か方法がないか検討してみます。

有山様、毎回丁寧にご回答頂きまして大変助かりました。
ありがとうございました!

egg

unread,
Feb 20, 2013, 3:23:36 AM2/20/13
to android-...@googlegroups.com
有山さん、nokoさん

> このトピックを見る限り、デフォルトのIMEをアプリから変更することは出来な
> いようですが、アプリの中限定で使うIMEを動的に変更することは、、、どうな
> んでしょうか。

systemユーザー権限ならSDKで、shellユーザー権限ならシェル越しに可能です。一般ユーザー権限で、かつ自分がその時点でアクティブなInputMethodでない場合に実現する方法は、私は知らないです。
------------------------------------------
EGAWA Takashi


2013年2月20日 16:52 Keiji Ariyama <ml_an...@c-lis.co.jp>:
> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-sdk-ja...@googlegroups.com にメールを送信します。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

noko

unread,
Feb 20, 2013, 3:48:31 AM2/20/13
to android-...@googlegroups.com
egg様

ご回答ありがとうございます。

現在は、通常のユーザー権限で使用することを想定しておりますが、
今後のアプリケーション制作の参考とさせて頂きます。

詳細な情報をありがとうございました。

noko
Reply all
Reply to author
Forward
0 new messages