인 텐트의 모든 엑스트라 나열


251

디버깅 목적으로 인 텐트의 모든 엑스트라 (및 해당 값)를 나열하고 싶습니다. 이제 열쇠를 얻는 것은 문제가되지 않습니다

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

그러나 키의 값을 얻는 것은 나에게는 하나입니다. 일부 값은 문자열이고 일부는 부울입니다 ... 루프에서 값을 가져오고 (키를 반복하는) 값을 로그 파일에 쓰는 방법은 무엇입니까? 힌트 주셔서 감사합니다!

답변:


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

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

23
Bundle bundle = data.getExtras();data의도는 어디에 있습니까 ? 안드로이드 초보자를위한.
정복자 Haki

2
로깅하기 전에 값이 널인지 확인해야합니다 value = "null".
Sebastian Kreft

감사합니다! 이 문서화되지 않은 iTracing 앱에 제공된 모든 키를 확인하여 저렴한 Bluetooth 버튼을 통해 휴대 전화를 제어 할 수있는 방법을 찾고있었습니다. 매력처럼 일했다!
Shane Smiskol

111

이것이 인 텐트의 모든 여분을 덤프하는 유틸리티 메소드를 정의하는 방법입니다.

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
감사! 이제 안드로이드 팀만이 유용한 .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는 인 텐트의 데이터를 기본 URI로 포함하고 액션, 카테고리, 유형, 플래그, 패키지, 구성 요소 및 기타를 설명하는 추가 조각으로 구성됩니다."


3
디버깅하고 의도의 내용이 무엇인지 확인하려면 이것이 최선의 선택입니다. 대단히 감사합니다
Shyri

이것은 정답입니다. 로그 디버깅에 적합합니다!
에단 아놀드

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
for (문자열 키 : extras.keySet ()) {Log.d (LOG_TAG, 키 + ":"+ extras.get (key)); }
Defuera

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);개체를 반환하는 호출 getClass().getName()유형을 얻기 위해 그 위에 한 다음 name.equals ( "문자열")를 입력 일들이 값을 얻기 위해, 당신이 실제로 호출해야하는 방법을 해결하는 경우의 집합을 ?


1

안드로이드 소스에서 거의 모든 작업으로 인해 번들이 데이터를 소포로 빼앗는 것으로 나타났습니다. 따라서 (나와 같이) 디버깅 목적 으로이 작업을 자주 수행 해야하는 경우 아래에 입력하는 것이 매우 빠릅니다.

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

0

이것이 너무 장황하거나 너무 늦다면 미안하지만, 이것이 내가 일을 끝내는 유일한 방법이었습니다. 가장 복잡한 요인은 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();
    }

코드를 너무 복잡하게 만들고 싶지 않다면 앱을 업데이트 할 수없는 것이 확실하지 않은 한이 간단한 일을하기 위해 너무 많은 코드를 작성하고 싶지 않습니다. 상위 2 개 답변은 훨씬 적은 코드로이 작업을 수행하며 이러한 용도로 토스트보다 더 나은 Log를 사용합니다.
Louis CAD

0

Kotlin 버전의 Pratik 유틸리티 방법 으로 모든 추가 기능을 덤프합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.