デバッグの理由から、インテントのすべてのエクストラ(およびその値)をリストしたいと思います。さて、キーを取得することは問題ではありません
Set<String> keys = intent.getExtras().keySet();
一部の値は文字列、一部はブール値であるため、キーの値を取得することは私にとって1つです...ループで値を取得し(キーをループ)、値をログファイルに書き込むにはどうすればよいですか?ヒントをありがとう!
デバッグの理由から、インテントのすべてのエクストラ(およびその値)をリストしたいと思います。さて、キーを取得することは問題ではありません
Set<String> keys = intent.getExtras().keySet();
一部の値は文字列、一部はブール値であるため、キーの値を取得することは私にとって1つです...ループで値を取得し(キーをループ)、値をログファイルに書き込むにはどうすればよいですか?ヒントをありがとう!
回答:
ドキュメントに記載されていない(サードパーティの)インテントに関する情報を取得するために使用したものは次のとおりです。
Bundle bundle = intent.getExtras();
if (bundle != null) {
for (String key : bundle.keySet()) {
Log.e(TAG, key + " : " + (bundle.get(key) != null ? bundle.get(key) : "NULL"));
}
}
bundle
ループの前にnull かどうかを確認してください。
if (bundle == null) { return; }
FTW
Bundle bundle = data.getExtras();
data
意図はどこにありますか。アンドロイド初心者向け。
value = "null"
。
これは、インテントのすべてのエクストラをダンプするユーティリティメソッドを定義する方法です。
import java.util.Iterator;
import java.util.Set;
import android.os.Bundle;
public static void dumpIntent(Intent i){
Bundle bundle = i.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
Log.e(LOG_TAG,"Dumping Intent start");
while (it.hasNext()) {
String key = it.next();
Log.e(LOG_TAG,"[" + key + "=" + bundle.get(key)+"]");
}
Log.e(LOG_TAG,"Dumping Intent end");
}
}
あなたはそれを1行のコードで行うことができます:
Log.d("intent URI", intent.toUri(0));
それは次のようなものを出力します:
"#Intent; action = android.intent.action.MAIN; category = android.intent.category.LAUNCHER; launchFlags = 0x10a00000; component = com.mydomain.myapp / .StartActivity; sourceBounds = 12%20870%20276%201167; l .profile = 0;終了」
この文字列の最後(私が太字にした部分)にエキストラのリストがあります(この例では1つだけ)。
これはtoUriのドキュメントによれば、「URIには、アクション、カテゴリ、タイプ、フラグ、パッケージ、コンポーネント、およびエクストラを説明する追加のフラグメントとともに、ベースURIとしてインテントのデータが含まれています。」
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("Extras: \n\r");
setContentView(tv);
StringBuilder str = new StringBuilder();
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
str.append(key);
str.append(":");
str.append(bundle.get(key));
str.append("\n\r");
}
tv.setText(str.toString());
}
}
Bundleのget(String key)メソッドはオブジェクトを返します。あなたの最善の策は、各キーでget(String)を呼び出し、オブジェクトでtoString()を使用してキーセットを出力することです。これはプリミティブに最適ですが、toString()を実装していないオブジェクトで問題が発生する場合があります。
Bundle extras = getIntent().getExtras();
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
Log.d("KEY", iterator.next());
}
インテントの内容をログに出力し、簡単に読み取れる方法が欲しかったので、ここに思いつきました。LogUtil
クラスを作成し、dumpIntent()
@ Pratikが作成したメソッドを使用して、少し変更しました。すべてが次のようになります。
public class LogUtil {
private static final String TAG = "IntentDump";
public static void dumpIntent(Intent i){
Bundle bundle = i.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("IntentDump \n\r");
stringBuilder.append("-------------------------------------------------------------\n\r");
for (String key : keys) {
stringBuilder.append(key).append("=").append(bundle.get(key)).append("\n\r");
}
stringBuilder.append("-------------------------------------------------------------\n\r");
Log.i(TAG, stringBuilder.toString());
}
}
}
これが誰かを助けることを願っています!
これが遅すぎたり遅すぎたりして申し訳ありませんが、これが私が仕事を成し遂げる唯一の方法でした。最も複雑な要因は、javaが参照渡し関数を持たないという事実でした。そのため、get --- Extraメソッドはデフォルト値を返す必要があり、ブール値を変更してデフォルト値が偶然に返されているかどうかを知ることはできません。または結果が好ましくなかったため。この目的のために、メソッドがデフォルトを返すよりもメソッドに例外を発生させるほうがいいでしょう。
ここに私の情報が見つかりました:Android Intent Documentation。
//substitute your own intent here
Intent intent = new Intent();
intent.putExtra("first", "hello");
intent.putExtra("second", 1);
intent.putExtra("third", true);
intent.putExtra("fourth", 1.01);
// convert the set to a string array
String[] anArray = {};
Set<String> extras1 = (Set<String>) intent.getExtras().keySet();
String[] extras = (String[]) extras1.toArray(anArray);
// an arraylist to hold all of the strings
// rather than putting strings in here, you could display them
ArrayList<String> endResult = new ArrayList<String>();
for (int i=0; i<extras.length; i++) {
//try using as a String
String aString = intent.getStringExtra(extras[i]);
// is a string, because the default return value for a non-string is null
if (aString != null) {
endResult.add(extras[i] + " : " + aString);
}
// not a string
else {
// try the next data type, int
int anInt = intent.getIntExtra(extras[i], 0);
// is the default value signifying that either it is not an int or that it happens to be 0
if (anInt == 0) {
// is an int value that happens to be 0, the same as the default value
if (intent.getIntExtra(extras[i], 1) != 1) {
endResult.add(extras[i] + " : " + Integer.toString(anInt));
}
// not an int value
// try double (also works for float)
else {
double aDouble = intent.getDoubleExtra(extras[i], 0.0);
// is the same as the default value, but does not necessarily mean that it is not double
if (aDouble == 0.0) {
// just happens that it was 0.0 and is a double
if (intent.getDoubleExtra(extras[i], 1.0) != 1.0) {
endResult.add(extras[i] + " : " + Double.toString(aDouble));
}
// keep looking...
else {
// lastly check for boolean
boolean aBool = intent.getBooleanExtra(extras[i], false);
// same as default, but not necessarily not a bool (still could be a bool)
if (aBool == false) {
// it is a bool!
if (intent.getBooleanExtra(extras[i], true) != true) {
endResult.add(extras[i] + " : " + Boolean.toString(aBool));
}
else {
//well, the road ends here unless you want to add some more data types
}
}
// it is a bool
else {
endResult.add(extras[i] + " : " + Boolean.toString(aBool));
}
}
}
// is a double
else {
endResult.add(extras[i] + " : " + Double.toString(aDouble));
}
}
}
// is an int value
else {
endResult.add(extras[i] + " : " + Integer.toString(anInt));
}
}
}
// to display at the end
for (int i=0; i<endResult.size(); i++) {
Toast.makeText(this, endResult.get(i), Toast.LENGTH_SHORT).show();
}
インテントのすべてのエクストラをダンプするPratikのユーティリティメソッドのKotlinバージョン:
fun dumpIntent(intent: Intent) {
val bundle: Bundle = intent.extras ?: return
val keys = bundle.keySet()
val it = keys.iterator()
Log.d(TAG, "Dumping intent start")
while (it.hasNext()) {
val key = it.next()
Log.d(TAG,"[" + key + "=" + bundle.get(key)+"]");
}
Log.d(TAG, "Dumping intent finish")
}
for (key in bundle.keySet())
デバッグするために必要なのが文字列(OPによって暗示されているが、明示的に述べられていない場合)の場合は、単にtoString
extrasで使用しますBundle
。
intent.getExtras().toString()
次のような文字列を返します。
Bundle[{key1=value1, key2=value2, key3=value3}]
ドキュメント:Bundle.toString()(残念ながら、これはデフォルトのObject.toString()
javadoc なので、ここではまったく役に立たない。)