【ご質問】言語設定の変更について

閲覧: 1,349 回
最初の未読メッセージにスキップ

Mitsuru horisato

未読、
2010/06/01 0:33:552010/06/01
To: android-g...@googlegroups.com
こんにちは、さてぃ@大阪です。

はじめてメール致します。今後とも宜しくお願い致しますm(_ _)m

Androidアプリの勉強始めたばかりなのですが、表題の件で行き詰ったので
ご質問致します。

詳しい方おられましたら、アドバイスお願い致します。

・アプリ上から言語設定を変更したいのですが、以下のようにすれば
 アプリ内では意図通り動作している事は確認できております。

Locale.setDefault(Local.xxx);
configuration config = new Configuration();
config.locale = Locale.xxx

getBaseContext().getResources().updateConfiguration(config, null);


で、ここから質問ですが・・・
さらに端末の言語設定自体を変更する方法が知りたいです。

ネットで色々検索したり、Androidのリファレンスなども調べたりしたのですが
現状見つけられていません。

"LOCALE_CHANGED"を Broadcast で飛ばしたりみたいな事も試したり
したのですが・・・上手くいきません。

言語設定を変更するアプリもありますので、方法はあると思うのですが
端末の設定を変更するので、何か特別な手続きとか必要なのでしょうか?

また、この辺のリファレンス読めばわかるよ!とかあれば、宜しくご教授
お願い致します。

以上、宜しくお願い致します。

Kozo Aono

未読、
2010/06/02 3:39:192010/06/02
To: android-g...@googlegroups.com

さてぃ@大阪様

 

1日経過してもレスポンスが内容なので,分かる範囲で回答します。

 

 

1.       設定で行なっている方法

Androidは大部分がオープンソースなので,設定用のプログラムのソースが公開されています。(LocalePicker.java)

これによると,

 

① IActivityManagerを作る

② Configurationを作り,ここにlocale情報を設定する

③ Configurationを更新する

④ BackupManagerでバックアップする

 

<ソースの抜粋>

          IActivityManager am = ActivityManagerNative.getDefault();                               ①

            Configuration config = am.getConfiguration();                                     ②

 

            Loc loc = mLocales[position];

            config.locale = loc.locale;

 

            // indicate this isn't some passing default - the user wants this remembered

            config.userSetLocale = true;

 

            am.updateConfiguration(config);                                                                  ③

            // Trigger the dirty bit for the Settings Provider.

            BackupManager.dataChanged("com.android.providers.settings");            ④

 

ただし,IActiveManager, ActivityManagerNative, Configuration及びBackupManagerクラスは次のパッケージで定義してあります。

import android.app.ActivityManagerNative;

import android.app.IActivityManager;

import android.backup.BackupManager;

import android.content.res.Configuration;

このうち,BackupManagerをのぞいて,SDKでは公開されていないパッケージです。

そのままimportしても,未定義エラーとなります。

 

2.       実装方法

Anroidのソースを取得できる方なら,公開されていないパッケージのソースを入手して,組み合わせてビルドすることで対応できます。

ソースを取得してしまえば,単なるjavaaidlなので簡単にビルドできます。

 

 

3.       リファレンスについて

以下は,Androidのソースを取得したときのパス名です。

GITを使用して取得してください。

設定方法は,LocalePicker.javaの最後にあります。(上記の抜粋の元ねたです)

 

公開していないパッケージのソース

android.app.ActivityManagerNative        frameworks/base/core/java/android/app/ActivityManagerNative.java

android.app.IActivityManager              frameworks/base/core/java/android/app/IActivityManager

android.content.res.Configuration         frameworks/base/core/java/android/content/res/Configuration.java 及び Configuration.aidl

 

Locale設定のソースは

packages/apps/Settings/src/com/android/settings/LocalePicker.java

 

 

Aono

 


--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

Mitsuru horisato

未読、
2010/06/02 4:34:212010/06/02
To: android-g...@googlegroups.com
Aono様

さてぃ@大阪です。

詳しいご説明ありがとうございます。

私も漠然と、Androidのソース自体を見ないとだめなのかなと思っていたところ
でした。

とても有益な情報感謝致します m(_ _)m

少し手続き難しそうですが、Aonoさん記載内容を参考に勉強しながらトライして
みます!

また、結果はお知らせ致します。

以上

kumagai

未読、
2010/06/02 6:19:172010/06/02
To: android-g...@googlegroups.com
はじめまして、kuma と申します。

JNI interface の使い方(作法)で戸惑っております。
詳しい方おられましたら、アドバイスお願い致します。


最初に、作成したいソースは、ある関数でJava側より、Native側へバッファを貸し出

別の関数で Native側のバッファの使用終了(メモリ解放をJava側で行う事を通知)

設定したいと考えています。

1.GetByteArrayElements(),ReleaseByteArrayElements () の使い方に付いて
 色々とサンプルコードを探しましたが、 同一関数内で 上記の関数を
必ず、ペアーで呼ぶ必要があるのでしょうか? 別関数にする事は
出来ないのでしょうか? 

 私が別関数に分けて実験したところ コンパイルは通りますが、
実際に動作さすとアプリが異常終了してしまいます。

 GetByteArrayElements()で、取得したバッファのアドレスは、
ReleaseByteArrayElements()を呼んだ後も、使い続けて良いのでしょうか?
Java側で取得したバッファを保持している間は使用しても問題は無いかとも
考えられますが(実際サンプルアプリでは動作しています)、本当に
この様な使い方が許されるのか分かりかねています。


作成しましたC言語側のソースを抜粋して記載いたします。

static jbyteArray gObjDataBufArray=NULL;
static jbyte *gObjDataBufAddr=NULL;
static jint gObjDataBufSize=0;

JNIEXPORT jint JNICALL Java_com_xx_yy_zz_aaa_1getbyte
(JNIEnv *env, jobject obj, jbyteArray objdatabuf)
{
jboolean isCopy;
gObjDataBufArray = objdatabuf;
gObjDataBufAddr = (*env)->GetByteArrayElements(env,
gObjDataBufArray,&isCopy);
gObjDataBufSize = (*env)->GetArrayLength(env,
gObjDataBufArray);
}

JNIEXPORT jint JNICALL Java_com_xx_yyy_zz_aaa_1releasebyte
(JNIEnv *env, jobject obj )
{
(*env)->ReleaseByteArrayElements(env, gObjDataBufArray,
gObjDataBufAddr,0);
}

2.Native 側へバッファの貸し出し方法
 1以外の方法で、Native側へのバッファの貸し出し方法があれば
教えて頂けませんでしょうか?


よろしくお願いします。

メッセージは削除されました

hc.nakahara

未読、
2010/06/02 11:41:542010/06/02
To: 日本Androidの会
なかはらです。
> GetByteArrayElements()で、取得したバッファのアドレスは、
> ReleaseByteArrayElements()を呼んだ後も、使い続けて良いのでしょうか?

できます。
gObjDataBufArray = objdatabuf;
ここを
gObjDataBufArray = (jbyteArray)(*env)->NewGlobalRef(env, objdatabuf);
で行けると思いますよ
解放の時にちゃんと
(*env)->DeleteGlobalRef(env, gObjDataBufArray);
とする必要はありますが
これを忘れるとJava側でこのメンバーにnull設定してもメモリ解放されません。
> 2.Native 側へバッファの貸し出し方法

Java側にバッファを取得するメソッドを用意して取得する事もできるかと思います。

kumagai

未読、
2010/06/03 1:18:542010/06/03
To: android-g...@googlegroups.com
なかはら様

kumaです。

教えて頂きました方法にて問題なく動作確認が出来ました。
私が知りたいポイントを ピンポイントで教えて頂き感謝しております。

今後ともよろしくお願いします。


-----Original Message-----
From: android-g...@googlegroups.com
[mailto:android-g...@googlegroups.com] On Behalf Of nakahara
Sent: Thursday, June 03, 2010 12:34 AM
To: android-g...@googlegroups.com
Subject: Re: [android-group-japan: 4454] JNI interface の使い方に付いて

なかはらです。

> GetByteArrayElements()で、取得したバッファのアドレスは、
> ReleaseByteArrayElements()を呼んだ後も、使い続けて良いのでしょうか?
できます。
gObjDataBufArray = objdatabuf;
ここを
gObjDataBufArray = (jbyteArray)(*env)->NewGlobalRef(env, objdatabuf);
で行けると思いますよ
解放の時にちゃんと
(*env)->DeleteGlobalRef(env, gObjDataBufArray);
とする必要はありますが
これを忘れるとJava側でこのメンバーにnull設定してもメモリ解放されません。

> 2.Native 側へバッファの貸し出し方法
Java側にバッファを取得するメソッドを用意して取得する事もできるかと思います。

2010年6月2日19:19 kumagai <ta.ku...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られ
ています。
> このグループに投稿するには、android-g...@googlegroups.com にメール
を送信してください。
> このグループから退会するには、
android-group-j...@googlegroups.com にメールを送信してくださ
い。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
からこのグループにアクセスしてください。
>
>

--
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
中原 智博(nakahara tomohiro)
MAIL : hc.na...@gmail.com
TEL : 06-6583-0974
mobile : 070-5653-7236
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

全員に返信
投稿者に返信
転送
新着メール 0 件