列出Intent的所有额外内容

ste*_*wpf 234 android android-intent

出于调试原因,我想列出Intent的所有额外内容(及其值).现在,获取密钥不是问题

Set<String> keys = intent.getExtras().keySet();
Run Code Online (Sandbox Code Playgroud)

但获取键的值对我来说是一个,因为一些值是字符串,一些是布尔值...我怎么能在循环中获取值(循环键)并将值写入日志文件?谢谢你的提示!

ksh*_*har 440

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

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

(确保bundle在循环之前检查是否为null)

  • `Bundle bundle = data.getExtras();`其中`data`是Intent.对于Android初学者. (21认同)
  • 如果值为null,则会导致NPE (5认同)
  • 我刚刚发现了[Intent Intercept Android app](https://github.com/intrications/intent-intercept).这也有效. (2认同)
  • 在记录之前,你需要检查值是否为null,如果是,则执行`value ="null"`. (2认同)

Pra*_*tik 107

这就是我如何定义实用程序方法来转储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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!现在,如果只有android团队开始实现这样的有用的.toString覆盖. (6认同)

Ale*_*ang 30

你可以在一行代码中完成它:

Log.d("intent URI", intent.toUri(0));
Run Code Online (Sandbox Code Playgroud)

它输出如下:

"#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,附加片段描述了操作,类别,类型,标志,包,组件和附加内容."

  • 如果您只想调试并查看intent的内容,这是最佳选择.非常感谢你 (3认同)
  • 这应该是公认的答案。非常适合日志调试! (2认同)

ruX*_*ruX 17

用于在调试模式下进行评估的 Kotlin 解决方案:

// list: List<Pair<String!, Any?>>?
val list = intent.extras?.keySet()?.map { it to (intent.extras?.get(it) ?: "null") }

Log.d("list", list.toString();
Run Code Online (Sandbox Code Playgroud)

这将打印捆绑包中所有额外内容的列表extras


use*_*321 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());
    }
}
Run Code Online (Sandbox Code Playgroud)


nic*_*ild 8

Bundle的get(String key)方法返回一个Object.最好的办法是旋转每个键上调用get(String)的键集,并使用Object上的toString()输出它们.这对于原语最有效,但是你可能会遇到没有实现toString()的对象的问题.


Luk*_*ner 5

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

希望这可以帮助某人!