একটি উদ্দেশ্য সমস্ত অতিরিক্ত তালিকাভুক্ত


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
আমি ইন্টেন্ট ইন্টারসেপ্ট অ্যান্ড্রয়েড অ্যাপ সম্পর্কে সবেমাত্র জানতে পেরেছি । এটিও কাজ করে।
বিনয়াক

1
if (bundle == null) { return; }এফটিডব্লিউ
ম্যাটিস

23
Bundle bundle = data.getExtras();dataইন্টেন্ট কোথায় । অ্যান্ড্রয়েড নতুনদের জন্য।
বিজয়ী হকী

2
লগিংয়ের আগে আপনাকে মানটি নাল কিনা তা পরীক্ষা করা দরকার, যদি তা করে থাকে value = "null"
সেবাস্তিয়ান ক্রেফ্ট

এর জন্য ধন্যবাদ! একটি সস্তা ব্লুটুথ বোতামের মাধ্যমে আমার ফোনটি নিয়ন্ত্রণ করার জন্য, এই অননুমোদিত আইট্রেসিং অ্যাপ্লিকেশনটিতে যে সমস্ত কী সরবরাহ করা হয়েছিল তা যাচাই করার জন্য একটি উপায় খুঁজছিলেন। মোহন মত কাজ!
শেন স্মিসকোল

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
ধন্যবাদ! এখন যদি কেবল অ্যান্ড্রয়েড দল কার্যকর .to স্ট্রিংকে এই জাতীয় ওভাররাইড কার্যকর করতে শুরু করে।
জিম ভিটেক

37

আপনি কোডের এক লাইনে এটি করতে পারেন:

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

এটি এরকম কিছু তৈরি করে:

"# ইন্টেন্ট; অ্যাকশন = অ্যান্ড্রয়েড.ইন্ট.অ্যাকটিশন.আরভি; বিভাগ = অ্যান্ড্রয়েড.ইন্টি.এইচ.টি.এইচআরএইচএন; লঞ্চফ্ল্যাগস = 0x10a00000; উপাদান = com.mydomain.myapp /। স্টার্টঅ্যাক্টিভিটি; উত্সবাউন্ডস = 12% 20870% 20276% 201167; এল .প্রোফাইল = 0; শেষ "

এই স্ট্রিংয়ের শেষে (যে অংশটি আমি সাহসী করেছি) আপনি অতিরিক্তগুলির তালিকা (এই উদাহরণে কেবলমাত্র একটি অতিরিক্ত) পেতে পারেন।

এটি টুরি ডকুমেন্টেশন অনুসারে : " ইউআরআইতে ইনটেন্টের ডেটা বেস ইউআরআই হিসাবে রয়েছে, ক্রিয়াকলাপ, বিভাগ, প্রকার, পতাকা, প্যাকেজ, উপাদান এবং অতিরিক্তগুলি বর্ণনা করে একটি অতিরিক্ত খণ্ডিত।"


3
যদি আপনি কেবল ডিবাগ করতে চান এবং উদ্দেশ্যটির বিষয়বস্তুগুলি কী তা দেখতে চান তবে এটি সেরা বিকল্প। আপনাকে অনেক ধন্যবাদ
শায়রি

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। লগ ডিবাগিং জন্য নিখুঁত!
ইথান আর্নল্ড

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 (স্ট্রিং কী) পদ্ধতিটি একটি অবজেক্ট ফেরত দেয়। আপনার সেরা বেটটি হ'ল প্রতিটি কী-তে কী সেট কলিং গিট (স্ট্রিং) ওপরে আউটপুটে টু স্ট্রিং () ব্যবহার করে them এটি আদিমদের পক্ষে সেরা কাজ করবে তবে আপনি অবজেক্টগুলির সাথে ইস্যুগুলি চালিয়ে যেতে পারেন যা একটি স্ট্রিং () প্রয়োগ করে না।


4
Bundle extras = getIntent().getExtras();
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
    Log.d("KEY", iterator.next());
}

1
(স্ট্রিং কী: এক্সট্রা.কিসেট ()) {লগ.ডি (লোগ্যাট্যাগ, কী + ":" + এক্সট্রা.সেট (কী)); }
Defuera

4

আমি লগের জন্য কোনও উদ্দেশ্যটির বিষয়বস্তু আউটপুট করার এবং এটি সহজেই পড়তে সক্ষম হতে চেয়েছিলাম, তাই আমি এখানে এসেছি। আমি একটি LogUtilক্লাস তৈরি করেছি , এবং তারপরে 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());
        }
    }
}

আশা করি এটি কাউকে সাহায্য করবে!


2

আপনি for (String key : keys) { Object o = get(key);কোনও অবজেক্ট ফিরিয়ে দিতে, getClass().getName()টাইপটি পেতে কল করুন এবং তারপরে মান পেতে হলে কোন পদ্ধতিতে আপনাকে কল করা উচিত সে জন্য name.equals ("স্ট্রিং") টাইপের জিনিসগুলির একটি সেট করতে পারেন in ?


1

আমি অ্যান্ড্রয়েড উত্সে লক্ষ্য করেছি যে প্রায় প্রতিটি অপারেশনই বান্ডিলটিকে তার ডেটা আনপার্সেল করতে বাধ্য করে। সুতরাং (যদি আমার মতো) আপনার এটি ডিবাগিংয়ের উদ্দেশ্যে ঘন ঘন করতে হয়, নীচে টাইপ করা খুব দ্রুত:

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

0

দুঃখিত এটি যদি খুব ভার্বোজ হয় বা খুব দেরিতে হয় তবে এই কাজটি করার জন্য এটিই আমি খুঁজে পেতাম। সবচেয়ে জটিল কারণটি ছিল যে জাভাটি রেফারেন্স ফাংশনগুলিতে পাস করে না, সুতরাং প্রাপ্তি --- অতিরিক্ত পদ্ধতিগুলি ফিরতে একটি ডিফল্ট প্রয়োজন এবং ডিফল্ট মানটি সুযোগ দ্বারা ফিরে আসছে কি না তা বলার জন্য বুলিয়ান মান পরিবর্তন করতে পারে না, বা ফলাফল অনুকূল ছিল না কারণ। এই উদ্দেশ্যে, পদ্ধতিটি একটি ডিফল্ট ফিরে আসার চেয়ে ব্যতিক্রম বাড়াতে ভাল হত।

আমি এখানে আমার তথ্য পেয়েছি: অ্যান্ড্রয়েড ইনটেন্ট ডকুমেন্টেশন

    //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 উত্তরগুলি খুব কম কোড দিয়ে এবং লগ ব্যবহার করে যা এই জাতীয় ব্যবহারের জন্য টোস্টের চেয়ে ভাল
লুই CAD

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

}

1
এটি ব্যবহার করা সহজ হবেfor (key in bundle.keySet())
ডিডোসোলিটারি

-2

ডিবাগিংয়ের জন্য যদি আপনি চান তবে একটি স্ট্রিং (ওপি দ্বারা বোঝানো বাছাই করা কিন্তু স্পষ্টভাবে বিবৃত নয়), কেবল toStringঅতিরিক্ত ব্যবহার করুন Bundle:

intent.getExtras().toString()

এটি একটি স্ট্রিং যেমন:

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

ডকুমেন্টেশন: Bundle.toString () (এটি দুর্ভাগ্যক্রমে ডিফল্ট Object.toString()জাভাদোক এবং যেমন এখানে যথেষ্ট অকেজো)


4
যখন আমি এটি চেষ্টা করে দেখি এটি ফিরে আসে: বান্ডিল [mParcelledData.dataSize = 480]
টডএইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.