Перечисление всех дополнительных компонентов

По причинам отладки я хочу перечислить все дополнения (и их значения) намерения. Теперь получение ключей не проблема

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"));
    }
}

Где data - намерение. Обязательно проверьте, является ли bundle нулевым, перед циклом.

Ответ 2

Вот как я определяю метод утилиты, чтобы сбрасывать все дополнения Intent.

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");
    }
}

Ответ 3

Вы можете сделать это в одной строке кода:

Log.d("intent URI", intent.toUri(0));

Он выводит что-то вроде:

"# Намерение; действие = android.intent.action.MAIN; категория = android.intent.category.LAUNCHER; launchFlags = 0x10a00000; компонент = com.mydomain.myapp/.StartActivity; sourceBounds = 12 %20870 %20276 %201167; l.profile = 0; end"

В конце этой строки (той части, которую я выделил) вы можете найти список дополнительных функций (только один дополнительный пример в этом примере).

Это соответствует документации toUri: "URI содержит данные Intent в качестве базового URI с дополнительным фрагментом, описывающим действие, категории, тип, флаги, пакет, компонент и дополнительные функции".

Ответ 4

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());
    }
}

Ответ 5

Метод get (String key) Bundle возвращает объект. Лучше всего прокрутить набор ключей, вызывающий get (String) на каждом ключе, и использовать toString() для объекта для вывода. Это будет работать лучше всего для примитивов, но вы можете столкнуться с проблемами с объектами, которые не реализуют toString().

Ответ 6

Bundle extras = getIntent().getExtras();
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
    Log.d("KEY", iterator.next());
}

Ответ 7

Мне нужен способ вывода содержимого намерения в журнал и возможность его легко прочитать, так что вот что я придумал. Я создал класс 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());
        }
    }
}

Надеюсь, это поможет кому-то!

Ответ 8

Вы можете использовать for (String key : keys) { Object o = get(key);, чтобы вернуть объект, вызвать getClass().getName() на нем, чтобы получить тип, а затем выполнить набор if, если name.equals( "String" ) набирают вещи, чтобы определить, какой метод вы должны на самом деле вызывать, чтобы получить значение?

Ответ 9

В Android-приложении я заметил, что почти каждая операция заставляет Bundle распараллеливать свои данные. Поэтому, если (как и я) вам нужно делать это часто для целей отладки, ниже очень быстро ввести:

Bundle extras = getIntent().getExtras();
extras.isEmpty(); // unparcel
System.out.println(extras);

Ответ 10

Извините, если это слишком многословно или слишком поздно, но это был единственный способ найти работу. Самым сложным фактором был тот факт, что java не имеет доступа к опорным функциям, поэтому для методов get --- Extra требуется возврат по умолчанию и не может изменять логическое значение, чтобы определить, возвращается ли значение по умолчанию случайно, или потому, что результаты не были благоприятными. Для этой цели было бы лучше, если бы метод вызывал исключение, чем возвращать значение по умолчанию.

Я нашел здесь свою информацию: Документация для Android Intent.

    //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();
    }

Ответ 11

Kotlin версия служебного метода Pratik, который сбрасывает все дополнения Intent:

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")

}

Ответ 12

Просто назовите намерение связки:

Bundle bundle = intent.getExtras();
if (bundle != null) {
    for (String key : bundle.keySet()) {
        Log.e(TAG, key + " : " + (bundle.get(key) != null ? bundle.get(key) : "NULL"));
    }
}

Ответ 13

Если для отладки все, что вам нужно, это строка (вроде подразумеваемой OP, но явно не заявленная), просто используйте toString для дополнительных функций Bundle:

intent.getExtras().toString()

Он возвращает строку, например:

Bundle[{key1=value1, key2=value2, key3=value3}]

Документация: Bundle.toString() (это, к сожалению, по умолчанию Object.toString() javadoc и как таковое совершенно бесполезно здесь.)