Android 列出意图的所有附加内容

Android 列出意图的所有附加内容,android,android-intent,Android,Android Intent,出于调试原因,我想列出一个Intent的所有附加项(及其值)。现在,拿到钥匙不是问题 Set<String> keys = intent.getExtras().keySet(); Set keys=intent.getExtras().keySet(); 但是获取键的值对我来说是一件事,因为有些值是字符串,有些是布尔值。。。如何在循环中获取值(通过键循环)并将值写入日志文件?谢谢你的提示 Bundle的get(字符串键)方法返回一个对象。最好的方法是旋转键集,在每个键上调用ge

出于调试原因,我想列出一个Intent的所有附加项(及其值)。现在,拿到钥匙不是问题

Set<String> keys = intent.getExtras().keySet();
Set keys=intent.getExtras().keySet();
但是获取键的值对我来说是一件事,因为有些值是字符串,有些是布尔值。。。如何在循环中获取值(通过键循环)并将值写入日志文件?谢谢你的提示

Bundle的get(字符串键)方法返回一个对象。最好的方法是旋转键集,在每个键上调用get(String),然后在对象上使用toString()输出它们。这对于基本体最为有效,但对于未实现toString()的对象,您可能会遇到问题

您可以使用
for(String key:keys){Object o=get(key);
来返回一个对象,对其调用
getClass().getName()
来获取类型,然后执行一组if name.equals(“String”)类型操作,以确定您应该实际调用哪个方法来获取值?

private TextView tv;
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());
    }
}
@凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); tv=新文本视图(此); tv.setText(“附加:\n\r”); 设置内容视图(电视); StringBuilder str=新的StringBuilder(); Bundle Bundle=getIntent().getExtras(); if(bundle!=null){ Set keys=bundle.keySet(); Iterator 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是否为null。

如果这太冗长或太晚,很抱歉,但这是完成任务的唯一方法。最复杂的因素是java没有通过引用传递函数,因此get---Extra方法需要返回默认值,并且无法修改boolean值来判断默认值是否是偶然返回的,或者是因为结果不好。为此,让方法引发异常比让它返回默认值更好

我在这里找到了我的信息:

String[]anArray={};
Set extras1=(Set)intent.getExtras().keySet();
String[]extras=(String[])extras1.toArray(anArray);
//保存所有字符串的arraylist
//您可以显示字符串,而不是将字符串放在这里
ArrayList endResult=新的ArrayList();

对于(inti=0;i这就是我如何定义实用方法来转储意图的所有额外内容

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");
    }
}
import java.util.Iterator;
导入java.util.Set;
导入android.os.Bundle;
公共静态无效转储意图(意图一){
Bundle=i.getExtras();
if(bundle!=null){
Set keys=bundle.keySet();
Iterator it=keys.Iterator();
Log.e(Log_标签,“转储意图开始”);
while(it.hasNext()){
String key=it.next();
Log.e(Log_标记,“[”+key+“=”+bundle.get(key)+“])”;
}
Log.e(Log_标签,“倾倒意图结束”);
}
}

如果调试所需的只是一个字符串(OP暗示了这一点,但没有明确说明),只需在extras
Bundle
上使用
toString

intent.getExtras().toString()
它返回一个字符串,例如:

Bundle[{key1=value1, key2=value2, key3=value3}]
文档:(不幸的是,它是默认的
Object.toString()
javadoc,因此在这里非常无用。)

Bundle extras=getIntent().getExtras();
Set ks=extras.keySet();
迭代器迭代器=ks.Iterator();
while(iterator.hasNext()){
Log.d(“KEY”,iterator.next());
}

我想要一种将意图的内容输出到日志的方法,并且能够轻松地读取它,所以我想到了以下方法。我创建了一个
LogUtil
类,然后使用@Pratik创建的
dumpIntent()
方法对其进行了一点修改。下面是它的样子:

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());
        }
    }
}
公共类LogUtil{
私有静态最终字符串TAG=“IntentDump”;
公共静态无效转储意图(意图一){
Bundle=i.getExtras();
if(bundle!=null){
Set keys=bundle.keySet();
StringBuilder StringBuilder=新的StringBuilder();
stringBuilder.append(“IntentDump\n\r”);
stringBuilder.append(“----------------------------------------------------------------\n\r”);
用于(字符串键:键){
stringBuilder.append(key.append(“=”).append(bundle.get(key)).append(“\n\r”);
}
stringBuilder.append(“----------------------------------------------------------------\n\r”);
Log.i(标签,stringBuilder.toString());
}
}
}

希望这对某人有所帮助!

我在Android源代码中注意到,几乎每个操作都会强制捆绑包解析其数据。因此,如果(像我一样)您需要经常这样做以进行调试,则可以快速键入以下内容:

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

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

Log.d("intent URI", intent.toUri(0));
它的输出类似于:

“#Intent;action=android.Intent.action.MAIN;category=android.Intent.category.launchFlags=0x10100000;component=com.mydomain.myapp/.StartActivity;sourceBounds=12%20870%20276%201167;l.profile=0;end”

在这个字符串的末尾(我加粗的部分),您可以找到额外的列表(本例中只有一个额外的)

这是根据: “URI包含作为基本URI的意图数据,还有一个描述操作、类别、类型、标志、包、组件和附加内容的附加片段。”

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

}

Kotlin oneliner,用于调试模式下的评估:

intent.extras.keySet().map{it to intent.extras.get(it)}
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());
        }
    }
}
Bundle extras = getIntent().getExtras();
extras.isEmpty(); // unparcel
System.out.println(extras);
Log.d("intent URI", intent.toUri(0));
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")

}