Niyetin tüm ekstralarını listeleme


251

Hata ayıklama nedenleriyle, bir Niyetin tüm ekstralarını (ve değerlerini) listelemek istiyorum. Şimdi, anahtarları almak sorun değil

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

ama bazı değerleri dize olduğu için anahtarların değerlerini almak benim için bir tane, bazıları boolean ... Değerleri bir döngüde (anahtarlar arasında döngü) nasıl alabilir ve değerleri bir günlük dosyasına yazabilirim? Herhangi bir ipucu için teşekkürler!

Yanıtlar:


467

Belgesiz (3. taraf) bir niyet hakkında bilgi almak için kullandığım şey:

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

bundleDöngüden önce boş olup olmadığını kontrol ettiğinizden emin olun .


2
Az önce Intent Intercept Android uygulamasını öğrendim . Bu da işe yarıyor.
Vinayak

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

23
Bundle bundle = data.getExtras();dataNiyet nerede . Android yeni başlayanlar için.
ConquerorsHaki

2
Günlüğe kaydetmeden önce değerin null olup olmadığını kontrol etmeniz gerekir value = "null".
Sebastian Kreft

Bunun için teşekkürler! Ucuz bir Bluetooth düğmesi ile telefonumu kontrol etmek için bu belgesiz iTracing uygulamasında sağlanan tüm tuşları kontrol etmek için bir yol arıyordu. Bir cazibe gibi çalıştı!
Shane Smiskol

111

Ben bir niyetin tüm ekstralar dökümü için yardımcı yöntem tanımlamak budur.

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
Teşekkürler! Şimdi sadece android ekibi bu gibi yararlı .toString geçersiz kılmaları uygulamaya başlarsa.
Jim Vitek

37

Tek bir kod satırında yapabilirsiniz:

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

Bunun gibi bir çıktı verir:

"#Intent; action = android.intent.action.MAIN; kategori = android.intent.category.LAUNCHER; launchFlags = 0x10a00000; bileşen = com.alanadim.myapp / .StartActivity; sourceBounds = 12% 20870% 20276% 201167; l .profile = 0; end "

Bu dizenin sonunda (kalın yazdığım kısım) ekstraların listesini bulabilirsiniz (bu örnekte yalnızca bir tane daha).

Bu, toUri belgelerine göre yapılır : "URI, eylemin, kategorilerin, türün, bayrakların, paketin, bileşenin ve ekstraların açıklandığı ek bir parça ile Niyet'in temel URI olarak verilerini içerir."


3
Sadece hata ayıklamak ve niyetin içeriğinin ne olduğunu görmek istiyorsanız, bu en iyi seçenektir. Çok teşekkür ederim
Shyri

Bu kabul edilen cevap olmalı. Günlük hata ayıklama için mükemmel!
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

Bundle'ın get (String key) yöntemi bir Object döndürür. En iyi seçeneğiniz, her tuşta get (String) çağırarak ve bunları çıktılamak için Object üzerinde toString () kullanarak anahtar kümesini döndürmektir. Bu en iyi ilkeler için işe yarayacaktır, ancak toString () uygulamayan Objeler ile ilgili sorunlarla karşılaşabilirsiniz.


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 (String key: extras.keySet ()) {Log.d (LOG_TAG, anahtar + ":" + extras.get (anahtar)); }
Defuera

4

Günlüğe bir niyetin içeriğini çıktılamak ve kolayca okuyabilmek için bir yol istedim, işte burada bulduğum şey. Bir LogUtilsınıf oluşturdum ve sonra dumpIntent()@Pratik'in oluşturduğu yöntemi aldım ve biraz değiştirdim. Her şey şöyle görünüyor:

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

Umarım bu birine yardımcı olur!


2

Sen kullanabilirsiniz for (String key : keys) { Object o = get(key);, bir nesne dönmek için çağrı getClass().getName()türünü almak için onun ve sonra name.equals ( "dize") türü şeyler değeri elde etmek amacıyla, gerçekte çağırarak olması gereken yöntem çalışmak için eğer bir dizi yapmak ?


1

Android kaynağında neredeyse her işlemin Bundle'u verilerini ayrıştırmaya zorladığını fark ettim. Bu yüzden (benim gibi) hata ayıklama amacıyla sık sık yapmanız gerekiyorsa, aşağıdakileri yazmak çok hızlıdır:

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

0

Bu çok ayrıntılı ya da çok geç olsa üzgünüm, ama işi yapmanın tek yolu buydu. En karmaşık faktör, java'nın referans işlevlerle geçişinin olmamasıydı, bu yüzden get --- Extra yöntemlerinin geri dönmek için bir varsayılana ihtiyacı vardır ve varsayılan değerin şans eseri döndürülüp döndürülmediğini söylemek için bir boole değerini değiştiremez, ya da sonuçlar olumlu olmadığı için. Bu amaçla, yöntemin bir varsayılan değer döndürmektense bir istisna oluşturması daha iyi olurdu.

Bilgilerimi burada buldum: 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

Belgeleri Ayarla

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

Kodunuzu çok karmaşık hale getirmek istemiyorsanız, uygulamanız için hiçbir zaman güncelleme yapamayacağınızdan emin olmadığınız sürece bu basit şeyi yapmak için çok fazla kod yazmak istemezsiniz. Top-2 cevapları bunu çok daha az kodla yapar ve bu tür kullanımlar için Toasts'tan daha iyi olan Log'u kullanır
Louis CAD

0

Pratik'in bir niyetin tüm ekstralarını boşaltan fayda yönteminin Kotlin versiyonu :

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
Kullanımı daha kolay olurdufor (key in bundle.keySet())
DDoSolitary

-2

Hata ayıklamak için istediğiniz tek şey bir dize ise (OP tarafından ima edilmiş ancak açıkça belirtilmemişse), sadece toStringekstraları kullanın Bundle:

intent.getExtras().toString()

Aşağıdaki gibi bir dize döndürür:

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

Belgeler: Bundle.toString () (maalesef varsayılan Object.toString()javadoc ve burada oldukça işe yaramaz.)


4
Bunu denediğimde döndürür: Bundle [mParcelledData.dataSize = 480]
ToddH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.