列出意图的所有附加功能


251

出于调试原因,我想列出一个Intent的所有其他内容(及其值)。现在,获取钥匙不是问题

Set<String> keys = intent.getExtras().keySet();

但是获取键的值对我来说是一个,因为有些值是字符串,有些是布尔值...我如何才能在循环中获取这些值(遍历键)并将这些值写入日志文件?感谢您的提示!

Answers:


467

这是我用来获取有关未记录的(第三方)意图的信息的内容:

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。


2
我刚刚发现了Intent Intercept Android应用程序。那也行。
Vinayak 2015年

1
if (bundle == null) { return; }FTW
Matyas 2015年

23
Bundle bundle = data.getExtras();data目的在哪里。对于android初学者。
征服者

2
在记录之前,您需要检查该值是否为null,如果是的话,请这样做value = "null"
塞巴斯蒂安·克雷夫特'16

谢谢你!正在寻找一种方法来检查此未记录的iTracing应用程序中提供的所有键,以通过廉价的蓝牙按钮控制我的手机。像魅力一样工作!
Shane Smiskol '17年

111

这就是我定义实用程序方法以转储所有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");
    }
}

8
谢谢!现在,如果只有android团队将开始实现有用的.toString重写,例如这样。
Jim Vitek

37

您可以在一行代码中完成此操作:

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;结束”

在此字符串的末尾(我加粗的部分),您可以找到附加项列表(此示例中仅一个附加项)。

根据toUri文档:“ URI包含Intent的数据作为基本URI,并带有描述操作,类别,类型,标志,包,组件和其他内容的附加片段。”


3
如果您只想调试并查看意图的内容,那么这是最佳选择。非常感谢
Shyri '17

这应该是公认的答案。非常适合日志调试!
伊桑·阿诺德

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

8

Bundle的get(String key)方法返回一个Object。最好的选择是遍历每个键上调用get(String)的键集,并使用Object上的toString()来输出它们。这将最适合基元,但是您可能会遇到未实现toString()的对象的问题。


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

1
对于(String key:extras.keySet()){Log.d(LOG_TAG,key +“:” + extras.get(key)); }
Defuera 2015年

4

我想要一种方法,可以将意图的内容输出到日志中,并能够轻松读取它,所以这就是我的想法。我创建了一个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());
        }
    }
}

希望这对某人有帮助!


2

您可以for (String key : keys) { Object o = get(key);用来返回一个Object,调用getClass().getName()它来获取类型,然后执行一组if name.equals(“ String”)类型的事情来算出您实际上应该调用的方法,以便获取该值。 ?


1

我在Android来源中注意到,几乎每个操作都会强制Bundle解包其数据。因此,如果(像我一样)出于调试目的而需要经常执行此操作,则可以快速键入以下内容:

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

0

抱歉,这太冗长或太迟,但这是我找到完成工作的唯一方法。最复杂的因素是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();
    }

您不希望编写太多代码来执行此简单操作,除非您想使代码复杂化,否则您肯定无法完成对应用程序的更新。前2个答案使用更少的代码并使用Log来做到这一点,这种用法比Toasts更好
Louis CAD

0

Pratik实用程序方法的Kotlin版本,它转储了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")

}

1
使用起来会更简单for (key in bundle.keySet())
DDoSolitary

-2

如果要调试的只是一个字符串(OP暗示但未明确说明),则只需toString在extras上使用Bundle

intent.getExtras().toString()

它返回一个字符串,例如:

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

文档:Bundle.toString()(不幸的是,它是默认的Object.toString()javadoc,因此在这里毫无用处。)


4
当我尝试此操作时,它返回:Bundle [mParcelledData.dataSize = 480]
ToddH,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.