การแสดงรายการพิเศษทั้งหมดของเจตนา


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เป็นโมฆะก่อนลูปหรือไม่


2
ฉันเพิ่งค้นพบเกี่ยวกับเจตนาสกัดกั้น Android app มันก็ใช้ได้เหมือนกัน
Vinayak

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

23
Bundle bundle = data.getExtras();dataเจตนาอยู่ที่ไหน สำหรับผู้เริ่มต้นใช้ Android
ConquerorsHaki

2
value = "null"ก่อนที่จะเข้าสู่ระบบคุณต้องตรวจสอบว่าค่าเป็นโมฆะถ้าเพื่อทำ
Sebastian Kreft

ขอบคุณสำหรับสิ่งนี้! กำลังมองหาวิธีตรวจสอบกุญแจทั้งหมดที่ให้ไว้ในแอพ iTracing ที่ไม่มีเอกสารนี้เพื่อควบคุมโทรศัพท์ของฉันผ่านปุ่มบลูทู ธ ราคาถูก ทำงานเหมือนจับใจ!
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
ขอบคุณ! ตอนนี้ถ้ามีเพียงทีม Android เท่านั้นที่จะเริ่มใช้การแทนที่. toring ที่มีประโยชน์เช่นนี้
Jim Vitek

37

คุณสามารถทำได้ในหนึ่งบรรทัดของรหัส:

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

มันแสดงผลเหมือน:

"#Intent; กระทำ = 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 ฐานพร้อมกับส่วนเพิ่มเติมที่อธิบายการกระทำหมวดหมู่ประเภทธงแพคเกจส่วนประกอบและส่วนเสริม"


3
หากคุณเพียงแค่ต้องการที่จะแก้ปัญหาและดูเนื้อหาของความตั้งใจนี้เป็นตัวเลือกที่ดีที่สุด ขอบคุณมาก
Shyri

นี่ควรเป็นคำตอบที่ยอมรับได้ เหมาะสำหรับการแก้ไขข้อบกพร่องบันทึก!
Ethan Arnold

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

วิธีการ get (คีย์สตริง) ของ Bundle จะส่งคืนวัตถุ ทางออกที่ดีที่สุดของคุณคือการหมุนชุดคีย์ที่เรียกรับ (สตริง) ในแต่ละคีย์และใช้ 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
สำหรับ (คีย์สตริง: extras.keySet ()) {Log.d (LOG_TAG, คีย์ + ":" + extras.get (คีย์)); }
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 ("String") เพื่อหาวิธีที่คุณควรจะโทรหาเพื่อรับค่า ?


1

ฉันสังเกตเห็นในแหล่ง Android ว่าเกือบทุกการดำเนินการบังคับให้ Bundle ยกเลิกการรวบรวมข้อมูล ดังนั้นหาก (เช่นฉัน) คุณต้องทำสิ่งนี้บ่อยครั้งเพื่อจุดประสงค์ในการดีบั๊กด้านล่างนี้เป็นประเภทที่รวดเร็วมากในการพิมพ์:

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

0

ขออภัยหาก verbose หรือสายเกินไป แต่นี่เป็นวิธีเดียวที่ฉันสามารถหาได้งานทำ ปัจจัยที่ซับซ้อนที่สุดคือความจริงที่ว่าจาวาไม่ได้ผ่านฟังก์ชั่นการอ้างอิงดังนั้นการรับ --- วิธีพิเศษต้องเริ่มต้นที่จะกลับมาและไม่สามารถแก้ไขค่าบูลีนเพื่อบอกว่าค่าเริ่มต้นจะถูกส่งกลับโดยบังเอิญหรือไม่ หรือเพราะผลลัพธ์ไม่ดี สำหรับจุดประสงค์นี้มันจะดีกว่าที่จะมีวิธีการยกข้อยกเว้นกว่าที่มันจะส่งกลับค่าเริ่มต้น

ผมพบว่าข้อมูลของฉันที่นี่: เอกสารแสดงเจตจำนง Android

    //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 ที่ทิ้งความตั้งใจพิเศษทั้งหมด:

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]
ทอดด์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.