কোড থেকে কীভাবে ডিভাইসের আইপি ঠিকানা পাবেন?


384

কিছু কোড ব্যবহার করে ডিভাইসের আইপি ঠিকানা পাওয়া সম্ভব?


5
ভুলে যাবেন না যে এটি আকার N এর একটি সংগ্রহ, এবং আপনি এটি এন == (0 || 1) ধরে নিতে পারবেন না। অন্য কথায়, এটি ধরে নিবেন না যে কোনও ডিভাইসে একটি নেটওয়ার্কের সাথে কথা বলার একমাত্র উপায় রয়েছে এবং এটি ধরে নেবেন না যে এটির সাথে কোনও নেটওয়ার্কে কথা বলার কোনও উপায় আছে।
জেমস মুর



আপনার এটি কোনও বাহ্যিক পরিষেবা থেকে পাওয়া উচিত ipof.in/txt এমন একটি পরিষেবা
ভিভেকভ

এটি কি অ্যান্ড্রয়েডে প্রোগ্রাম্যাটিকভাবে পাওয়া সম্ভব?
তন্ময় সাহু

উত্তর:


435

আইপি এবং ম্যাকের ঠিকানাগুলি পড়তে এটি আমার সহায়ক। বাস্তবায়ন বিশুদ্ধ-জাভা, তবে আমার কাছে একটি মন্তব্য ব্লক রয়েছে getMACAddress()যাতে বিশেষ লিনাক্স (অ্যান্ড্রয়েড) ফাইল থেকে মানটি পড়তে পারে। আমি এই কোডটি কেবল কয়েকটি ডিভাইস এবং এমুলেটরে চালিয়েছি তবে আপনি যদি অদ্ভুত ফলাফল পান তবে আমাকে এখানে জানান।

// AndroidManifest.xml permissions
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

// test functions
Utils.getMACAddress("wlan0");
Utils.getMACAddress("eth0");
Utils.getIPAddress(true); // IPv4
Utils.getIPAddress(false); // IPv6 

Utils.java

import java.io.*;
import java.net.*;
import java.util.*;   
//import org.apache.http.conn.util.InetAddressUtils;

public class Utils {

    /**
     * Convert byte array to hex string
     * @param bytes toConvert
     * @return hexValue
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sbuf = new StringBuilder();
        for(int idx=0; idx < bytes.length; idx++) {
            int intVal = bytes[idx] & 0xff;
            if (intVal < 0x10) sbuf.append("0");
            sbuf.append(Integer.toHexString(intVal).toUpperCase());
        }
        return sbuf.toString();
    }

    /**
     * Get utf8 byte array.
     * @param str which to be converted
     * @return  array of NULL if error was found
     */
    public static byte[] getUTF8Bytes(String str) {
        try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; }
    }

    /**
     * Load UTF8withBOM or any ansi text file.
     * @param filename which to be converted to string
     * @return String value of File
     * @throws java.io.IOException if error occurs
     */
    public static String loadFileAsString(String filename) throws java.io.IOException {
        final int BUFLEN=1024;
        BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN);
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN);
            byte[] bytes = new byte[BUFLEN];
            boolean isUTF8=false;
            int read,count=0;           
            while((read=is.read(bytes)) != -1) {
                if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF ) {
                    isUTF8=true;
                    baos.write(bytes, 3, read-3); // drop UTF8 bom marker
                } else {
                    baos.write(bytes, 0, read);
                }
                count+=read;
            }
            return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray());
        } finally {
            try{ is.close(); } catch(Exception ignored){} 
        }
    }

    /**
     * Returns MAC address of the given interface name.
     * @param interfaceName eth0, wlan0 or NULL=use first interface 
     * @return  mac address or empty string
     */
    public static String getMACAddress(String interfaceName) {
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface intf : interfaces) {
                if (interfaceName != null) {
                    if (!intf.getName().equalsIgnoreCase(interfaceName)) continue;
                }
                byte[] mac = intf.getHardwareAddress();
                if (mac==null) return "";
                StringBuilder buf = new StringBuilder();
                for (byte aMac : mac) buf.append(String.format("%02X:",aMac));  
                if (buf.length()>0) buf.deleteCharAt(buf.length()-1);
                return buf.toString();
            }
        } catch (Exception ignored) { } // for now eat exceptions
        return "";
        /*try {
            // this is so Linux hack
            return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim();
        } catch (IOException ex) {
            return null;
        }*/
    }

    /**
     * Get IP address from first non-localhost interface
     * @param useIPv4   true=return ipv4, false=return ipv6
     * @return  address or empty string
     */
    public static String getIPAddress(boolean useIPv4) {
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface intf : interfaces) {
                List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
                for (InetAddress addr : addrs) {
                    if (!addr.isLoopbackAddress()) {
                        String sAddr = addr.getHostAddress();
                        //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
                        boolean isIPv4 = sAddr.indexOf(':')<0;

                        if (useIPv4) {
                            if (isIPv4) 
                                return sAddr;
                        } else {
                            if (!isIPv4) {
                                int delim = sAddr.indexOf('%'); // drop ip6 zone suffix
                                return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase();
                            }
                        }
                    }
                }
            }
        } catch (Exception ignored) { } // for now eat exceptions
        return "";
    }

}

দাবি অস্বীকার: এই ইউটিলস ক্লাসে আইডিয়াস এবং উদাহরণ কোডটি বেশ কয়েকটি এসও পোস্ট এবং গুগল থেকে এসেছে। আমি সমস্ত উদাহরণগুলি পরিষ্কার করে একত্রিত করেছি।


17
GetHardwareAddress () এর কারণে এটির জন্য এপিআই স্তর 9 এবং ততোধিক প্রয়োজন।
ক্যালভিন

2
সমস্যা - লিঙ্ক সতর্কতা চালু toUpperCase()। ক্যাচিং Exceptionসর্বদা দোষযুক্ত (এবং সহায়তার পদ্ধতিগুলি যেভাবেই ছুঁড়ে ফেলা উচিত এবং কলারটিকে ব্যতিক্রমের সাথে ডিল করা উচিত - যদিও এটি সংশোধন করেনি)। ফর্ম্যাট করা: 80 টি লাইনের বেশি হওয়া উচিত নয়। getHardwareAddress()- প্যাচের জন্য শর্তসাপেক্ষ কার্যকর : github.com/Utumno/AndroidHelpers/commit/… । তুমি কী বল ?
মিঃ_আর_আমস_ডি

5
আপনি যদি কোনও স্থানীয় নেটওয়ার্কে থাকেন (যেমন ওয়াইফাই বা এমুলেটর), আপনি একটি ব্যক্তিগত আইপি ঠিকানা পাবেন। আপনি একটি নির্দিষ্ট ওয়েবসাইট থেকে একটি অনুরোধ আপনি প্রক্সি ঠিকানা দেয় মাধ্যমে প্রক্সি IP ঠিকানা পেতে পারেন, যেমন whatismyip.akamai.com
জুলিয়েন Kronegg

1
এটি ওয়াইফাই ব্যবহার করে রিয়েল ডিভাইসের সাথে আমার জন্য নিখুঁত কাজ করে। অনেক ধন্যবাদ, ভাই
জনাব নিও

5
আইপি ঠিকানা পাওয়ার চেষ্টা করার সময় আমি একটি নেক্সাস 6 এ থেকে খারাপ ফলাফল পাচ্ছি। আমার কাছে "নাম: ডামি0 (ডামি0)" নামের একটি নেটওয়ার্কইন্টারফেস রয়েছে যা "/ এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স 0% ডামি0" আছে, তবে একটি বাস্তব নেটওয়ার্ক ইন্টারফেসও রয়েছে যা wlan0 এর সাথে মিলে যায়, তবে যেহেতু "ডামি" প্রথম হয় আমি সর্বদা সেই ডামি ঠিকানাটি পাই
জুলিয়ান সুয়ারেজ

201

এটি আমার পক্ষে কাজ করেছে:

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

10
এই আমার জন্য কাজ করে। তবে এটির জন্য "ACCESS_WIFI_STATE" অনুমতি প্রয়োজন এবং "উমাইর" লিখেছেন, তালিকার ব্যবহারের প্রয়োজন নেই।
অ্যান্ড্রয়েড বিকাশকারী

13
formatIpAdress কোনও কারণে অবচিত করা হয়েছে। পরিবর্তে কি ব্যবহার করা উচিত?
অ্যান্ড্রয়েড বিকাশকারী

8
দস্তাবেজগুলি থেকে: ব্যবহার করুন getHostAddress(), যা আইপিভি 4 এবং আইপিভি 6 ঠিকানা উভয় সমর্থন করে supports এই পদ্ধতিটি IPv6 ঠিকানাগুলিকে সমর্থন করে না।
রায়ান আর

7
সার্ভার ও ক্লায়েন্ট আইপি ঠিকানা @ রায়ানআর পেতে getHostAddress () কীভাবে ব্যবহার করবেন?
gumuruh

42
ব্যবহারকারী এখনও ওয়াইফাইয়ের পরিবর্তে ডেটা ব্যবহার করলেও এটি কি কাজ করবে?
পিনয়কোডার

65

আমি নিম্নলিখিত কোড ব্যবহার করেছি: হ্যাশকোড ব্যবহার করার কারণটি হ'ল কারণ আমি যখন ব্যবহার করছিলাম তখন আইপি ঠিকানায় কিছু বর্জ্য মান যুক্ত হচ্ছিল getHostAddress। তবে hashCodeআমার পক্ষে সত্যই ভাল কাজ করেছে কারণ আমি সঠিক ফর্ম্যাটিংয়ের সাথে আইপি ঠিকানা পেতে ফর্ম্যাটরটি ব্যবহার করতে পারি।

এখানে উদাহরণ আউটপুট:

1. ব্যবহার getHostAddress:***** IP=fe80::65ca:a13d:ea5a:233d%rmnet_sdio0

২. hashCodeএবং ব্যবহার Formatter: ***** IP=238.194.77.212

আপনি দেখতে পারেন 2 য় পদ্ধতি আমাকে আমার যা প্রয়োজন তা দেয় gives

public String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    String ip = Formatter.formatIpAddress(inetAddress.hashCode());
                    Log.i(TAG, "***** IP="+ ip);
                    return ip;
                }
            }
        }
    } catch (SocketException ex) {
        Log.e(TAG, ex.toString());
    }
    return null;
}

1
getHostAddress()আপনি যোগ করা ফর্ম্যাটার স্টাফ হিসাবে একই কাজ করবে।
ফিল

10
হ্যাশকোড ব্যবহার করা সরল ভুল এবং বাজে কথা বলে। পরিবর্তে InetAddress.getHostAddress () ব্যবহার করুন।
পয়েন্টার নুল

এই অংশটি পরিবর্তন করুন: if (! inetAddress.isLoopbackAddress ()) ring স্ট্রিং আইপি = Formatter.formatIpAddress (inetAddress.hashCode ()); লগ.আই (ট্যাগ, "***** আইপি =" + আইপি); রিটার্ন আইপি; this এর সাথে: যদি (! inetAddress.isLoopbackAddress () && InetAddressUtils.isIPv4Adress (inetAddress.getHostAddress ()) {inetAddress .getHostAddress ()। toString (); } এটি আপনাকে সঠিক আইপি ফর্ম্যাটটি দেবে
Chuy47

কোডটি কেবল প্রথম আইপি ফেরত দেয়, একটি ফোনে সেলুয়ার, ওয়াইফাই এবং বিটি ঠিকানা একই সাথে থাকতে পারে
রিকার

@ চুই 47 এটি ইনটএড্রেস
ইউটিসগুলি

61
public static String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                    return inetAddress.getHostAddress();
                }
            }
        }
    } catch (SocketException ex) {
        ex.printStackTrace();
    }
    return null;
}

আমি এটি আইপিভি 4 ঠিকানা কিনা তা পরীক্ষা করার জন্য inetAddressউদাহরণ যোগ করেছি Inet4Address


আমার দিন বাঁচায়! ধন্যবাদ। এটি স্যামসং এস 7 প্রান্তে কাজ করা একমাত্র কোড
ধনঞ্জয় সরসোনিয়া

এটি আসল উত্তর, এর পরিবর্তে কেবলমাত্র ওয়াইফাই ইন্টারফেস পান।
16:25

এটি সত্যই সঠিক উত্তর হওয়া উচিত, এটি ওয়াইফাই এবং মোবাইল নেটওয়ার্ক উভয়ের জন্যই কাজ করে এবং কাস্টম বিন্যাসের পরিবর্তে "getHostAddress" ব্যবহার করে।
বালজস জেরলি মাই

তবে এটি আমার স্থানীয় আইপি পেয়েছে, আমার আমার পাবলিক আইপি দরকার (যেমন আমি বিশ্বাস করি যে
ওপিকেও

53

যদিও সঠিক উত্তর রয়েছে, আমি আমার উত্তরটি এখানে ভাগ করে নিচ্ছি এবং আশা করি যে এই উপায়ে আরও সুবিধা হবে।

WifiManager wifiMan = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInf = wifiMan.getConnectionInfo();
int ipAddress = wifiInf.getIpAddress();
String ip = String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));

4
ধন্যবাদ! ফর্ম্যাটর অবহেলা করা হয়েছে, এবং আমি সহজ বিট লজিক লেখার মতো মনে করি না।
উইলিয়াম মরিসন

4
দুর্দান্ত কাজ করে তবে ডাব্লু ওয়াইফাইপেট অনুমতি প্রয়োজন:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
ব্রেন্ট ফাউস্ট

1
আমি ফর্ম্যাটারটি ব্যবহার করি তবে এটি কাজ করে না। বেশ ভালো! সত্যিই প্রশংসা. আপনি শেষ লাইনে কী করা যায় তা ব্যাখ্যা করতে পারেন। আমি% d।% D।% D।% D তবে অন্যরা জানি? ধন্যবাদ
Günay Gültekin

1
না এটি সরাসরি ওপিকে উত্তর দিচ্ছে না। কারণ সমস্ত অ্যান্ড্রয়েড ডিভাইস ইন্টারনেটের সাথে সংযোগ করতে ওয়াইফাই ব্যবহার করে না। এটিতে ইথারনেট, বা বিটি-তে নাটযুক্ত ল্যান থাকতে পারে এবং নেটেড ডাব্লুএন সংযোগ ইত্যাদি নয়
16-24 এ এনকনিং

31

নীচে কোড আপনাকে সাহায্য করতে পারে .. অনুমতি যুক্ত করতে ভুলবেন না ..

public String getLocalIpAddress(){
   try {
       for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();  
       en.hasMoreElements();) {
       NetworkInterface intf = en.nextElement();
           for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
           InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                return inetAddress.getHostAddress();
                }
           }
       }
       } catch (Exception ex) {
          Log.e("IP Address", ex.toString());
      }
      return null;
}

ম্যানিফেস্ট ফাইলে নীচে অনুমতি যুক্ত করুন।

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

শুভ কোডিং !!


6
আরে এটির মতো একটি ভুল মানটি ফিরে আসে: "fe80 :: f225: b7ff: fe8c: d357% wlan0"
জর্জেসিস

@ জর্জেসিস এভারটভেনডেনব্রুয়েলের উত্তরের জন্য যাচাই করুন যেখানে তিনি ইনটেড অ্যাড্রেস
ইনটেট

3
পরিস্থিতিটি সঠিক আইপি পেতে হলে এইভাবে পরিবর্তন করুন: যদি (! inetAddress.isLoopbackAddress () && InetAdress উদাহরণ ইনট 4 অ্যাড্রেস)
রাজেশ.ক

কোডটি কেবল প্রথম আইপি ফেরত দেয়, একটি ফোনে একই সাথে সেলুয়ার, ওয়াইফাই এবং বিটি ঠিকানা থাকতে পারে
রিকার

আপনার যদি হটস্পট চালু থাকে তবে আপনি একাধিক আইপি পেতে পারেন
হর্ষ

16

এখন পর্যন্ত সরবরাহকৃত সমাধানগুলির ক্ষেত্রে আপনার মতো অনুমতিগুলি যুক্ত করার দরকার নেই। স্ট্রিং হিসাবে এই ওয়েবসাইটটি ডাউনলোড করুন:

http://www.ip-api.com/json

অথবা

http://www.telize.com/geoip

স্ট্রিং হিসাবে কোনও ওয়েবসাইট ডাউনলোড করা জাভা কোডের সাহায্যে করা যেতে পারে:

http://www.itcuties.com/java/read-url-to-string/

JSON অবজেক্টটি এভাবে পার্স করুন:

https://stackoverflow.com/a/18998203/1987258

Json বৈশিষ্ট্য "ক্যোয়ারী" বা "আইপি" আইপি ঠিকানা ধারণ করে address


2
এর জন্য ইন্টারনেট সংযোগ দরকার। বড় সমস্যা
ডেভিড

4
কেন যে একটি বড় সমস্যা? অবশ্যই আপনার একটি ইন্টারনেট সংযোগ প্রয়োজন কারণ একটি আইপি ঠিকানা প্রযুক্তিগতভাবে এই জাতীয় সংযোগের সাথে সম্পর্কিত। আপনি যদি আপনার বাড়ি ছেড়ে কোনও রেস্তোঁরায় যান তবে আপনি অন্য একটি ইন্টারনেট সংযোগ এবং এই জাতীয় অন্য আইপি ঠিকানা ব্যবহার করবেন। ACCESS_NETWORK_STATE বা ACCESS_WIFI_STATE এর মতো আরও কিছু যুক্ত করার জন্য আপনার কিছু দরকার নেই। একটি ইন্টারনেট সংযোগ হ'ল আমার সরবরাহিত সমাধানের জন্য আপনার একমাত্র অনুমতি দরকার।
দান

2
কোন ডোমেইন? যদি আইপিএপি.কম কোনও কাজ না করে, আপনি ফেলব্যাক হিসাবে telize.com ব্যবহার করতে পারেন। অন্যথায় আপনি api.ipify.org ব্যবহার করতে পারেন । এটি এখানেও পাওয়া যায় ( জসন নয়): ip.jsontest.com/?callback=showIP । অনেক অ্যাপ্লিকেশন অনলাইনে থাকার গ্যারান্টিযুক্ত ডোমেনগুলি ব্যবহার করে; এটা স্বাভাবিক। তবে আপনি যদি ফ্যালব্যাকগুলি ব্যবহার করেন তবে এটির সমস্যা হওয়ার সম্ভাবনা খুব বেশি।
দান

3
ডেভিডের মূল বিষয়টি এখনও দাঁড়িয়ে আছে। আপনি যদি কোনও অভ্যন্তরীণ নেটওয়ার্কে থাকেন যার কাছে ইন্টারনেট অ্যাক্সেস নেই What
হিন্ডবাই

2
আমি এটি সম্পর্কে কখনই ভাবিনি কারণ আমি এমন কোনও অ্যাপ্লিকেশনটির কোনও ব্যবহারিক উদ্দেশ্য জানি না যা অবশ্যই নেটওয়ার্কের প্রয়োজন তবে ইন্টারনেট ব্যতীত কাজ করা উচিত (সম্ভবত সেখানে রয়েছে তবে আমি এটি মোবাইল ডিভাইসের জন্য দেখতে পাচ্ছি না)।
দান

9
private InetAddress getLocalAddress()throws IOException {

            try {
                for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                    NetworkInterface intf = en.nextElement();
                    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                        InetAddress inetAddress = enumIpAddr.nextElement();
                        if (!inetAddress.isLoopbackAddress()) {
                            //return inetAddress.getHostAddress().toString();
                            return inetAddress;
                        }
                    }
                }
            } catch (SocketException ex) {
                Log.e("SALMAN", ex.toString());
            }
            return null;
        }

1
এটি কি 192.168.0.x এর মত ওয়াইফাই ইন্টারফেস থেকে ব্যক্তিগত নেটওয়ার্ক আইপি ফিরিয়ে আনতে পারে? বা এটি কি সর্বদা বহিরাগত আইপি ঠিকানাটি ফেরত দেবে, এটি ইন্টারনেটে ব্যবহৃত হবে?
বেন এইচ

9

পদ্ধতি getDeviceIpAdressress ডিভাইসের আইপি ঠিকানা ফেরত দেয় এবং যদি সংযুক্ত থাকে তবে ওয়াইফাই ইন্টারফেসের ঠিকানাটি পছন্দ করে।

  @NonNull
    private String getDeviceIpAddress() {
        String actualConnectedToNetwork = null;
        ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connManager != null) {
            NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (mWifi.isConnected()) {
                actualConnectedToNetwork = getWifiIp();
            }
        }
        if (TextUtils.isEmpty(actualConnectedToNetwork)) {
            actualConnectedToNetwork = getNetworkInterfaceIpAddress();
        }
        if (TextUtils.isEmpty(actualConnectedToNetwork)) {
            actualConnectedToNetwork = "127.0.0.1";
        }
        return actualConnectedToNetwork;
    }

    @Nullable
    private String getWifiIp() {
        final WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if (mWifiManager != null && mWifiManager.isWifiEnabled()) {
            int ip = mWifiManager.getConnectionInfo().getIpAddress();
            return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "."
                    + ((ip >> 24) & 0xFF);
        }
        return null;
    }


    @Nullable
    public String getNetworkInterfaceIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                NetworkInterface networkInterface = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                        String host = inetAddress.getHostAddress();
                        if (!TextUtils.isEmpty(host)) {
                            return host;
                        }
                    }
                }

            }
        } catch (Exception ex) {
            Log.e("IP Address", "getLocalIpAddress", ex);
        }
        return null;
    }

4

এটি এই উত্তরের পুনঃনির্মাণ যা অপ্রাসঙ্গিক তথ্যগুলি ছড়িয়ে দেয়, সহায়ক মন্তব্যগুলি যুক্ত করে, নামগুলি আরও পরিষ্কারভাবে নাম দেয় এবং যুক্তিকে উন্নত করে।

নিম্নলিখিত অনুমতিগুলি অন্তর্ভুক্ত করতে ভুলবেন না:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

InternetHelper.java:

public class InternetHelper {

    /**
     * Get IP address from first non-localhost interface
     *
     * @param useIPv4 true=return ipv4, false=return ipv6
     * @return address or empty string
     */
    public static String getIPAddress(boolean useIPv4) {
        try {
            List<NetworkInterface> interfaces =
                    Collections.list(NetworkInterface.getNetworkInterfaces());

            for (NetworkInterface interface_ : interfaces) {

                for (InetAddress inetAddress :
                        Collections.list(interface_.getInetAddresses())) {

                    /* a loopback address would be something like 127.0.0.1 (the device
                       itself). we want to return the first non-loopback address. */
                    if (!inetAddress.isLoopbackAddress()) {
                        String ipAddr = inetAddress.getHostAddress();
                        boolean isIPv4 = ipAddr.indexOf(':') < 0;

                        if (isIPv4 && !useIPv4) {
                            continue;
                        }
                        if (useIPv4 && !isIPv4) {
                            int delim = ipAddr.indexOf('%'); // drop ip6 zone suffix
                            ipAddr = delim < 0 ? ipAddr.toUpperCase() :
                                    ipAddr.substring(0, delim).toUpperCase();
                        }
                        return ipAddr;
                    }
                }

            }
        } catch (Exception ignored) { } // if we can't connect, just return empty string
        return "";
    }

    /**
     * Get IPv4 address from first non-localhost interface
     *
     * @return address or empty string
     */
    public static String getIPAddress() {
        return getIPAddress(true);
    }

}

4

কোটলিন সংক্ষিপ্ত সংস্করণ

fun getIpv4HostAddress(): String {
    NetworkInterface.getNetworkInterfaces()?.toList()?.map { networkInterface ->
        networkInterface.inetAddresses?.toList()?.find {
            !it.isLoopbackAddress && it is Inet4Address
        }?.let { return it.hostAddress }
    }
    return ""
}

3
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString();

3

এই সাইট থেকে আইপি পেতে কেবল ভলিকে ব্যবহার করুন

RequestQueue queue = Volley.newRequestQueue(this);    
String urlip = "http://checkip.amazonaws.com/";

    StringRequest stringRequest = new StringRequest(Request.Method.GET, urlip, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            txtIP.setText(response);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            txtIP.setText("didnt work");
        }
    });

    queue.add(stringRequest);

2

সম্প্রতি, একটি আইপি ঠিকানা getLocalIpAddress()নেটওয়ার্ক থেকে সংযোগ বিচ্ছিন্ন হওয়া সত্ত্বেও এখনও ফিরে আসে (কোনও পরিষেবা সূচক নেই)। এর অর্থ সেটিংস> ফোনের বিষয়ে> অবস্থানের ক্ষেত্রে প্রদর্শিত আইপি ঠিকানাটি অ্যাপ্লিকেশনটির ধারণা থেকে আলাদা ছিল।

আমি এই কোডটি আগে যুক্ত করে একটি বাস্তব প্রয়োগ করেছি:

ConnectivityManager cm = getConnectivityManager();
NetworkInfo net = cm.getActiveNetworkInfo();
if ((null == net) || !net.isConnectedOrConnecting()) {
    return null;
}

কারও কাছে কি ঘণ্টা বাজে?


2

বিন্যাস ছাড়াই কোটলিনে

private fun getIPAddress(useIPv4 : Boolean): String {
    try {
        var interfaces = Collections.list(NetworkInterface.getNetworkInterfaces())
        for (intf in interfaces) {
            var addrs = Collections.list(intf.getInetAddresses());
            for (addr in addrs) {
                if (!addr.isLoopbackAddress()) {
                    var sAddr = addr.getHostAddress();
                    var isIPv4: Boolean
                    isIPv4 = sAddr.indexOf(':')<0
                    if (useIPv4) {
                        if (isIPv4)
                            return sAddr;
                    } else {
                        if (!isIPv4) {
                            var delim = sAddr.indexOf('%') // drop ip6 zone suffix
                            if (delim < 0) {
                                return sAddr.toUpperCase()
                            }
                            else {
                                return sAddr.substring(0, delim).toUpperCase()
                            }
                        }
                    }
                }
            }
        }
    } catch (e: java.lang.Exception) { }
    return ""
}

2

আপনার ক্রিয়াকলাপে, নিম্নলিখিত ফাংশনটি getIpAddress(context)ফোনের আইপি ঠিকানা প্রদান করে:

public static String getIpAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getApplicationContext()
                .getSystemService(WIFI_SERVICE);

    String ipAddress = intToInetAddress(wifiManager.getDhcpInfo().ipAddress).toString();

    ipAddress = ipAddress.substring(1);

    return ipAddress;
}

public static InetAddress intToInetAddress(int hostAddress) {
    byte[] addressBytes = { (byte)(0xff & hostAddress),
                (byte)(0xff & (hostAddress >> 8)),
                (byte)(0xff & (hostAddress >> 16)),
                (byte)(0xff & (hostAddress >> 24)) };

    try {
        return InetAddress.getByAddress(addressBytes);
    } catch (UnknownHostException e) {
        throw new AssertionError();
    }
}

আমি 0.0.0.0
নটসুমিয়ু

আপনার ফোনটি কোনও ওয়াইফাই নেটওয়ার্কের সাথে সংযুক্ত আছে? আপনি wifiManager.getConnicationInfo ()। GetSSID () কল করলে কোন মানটি ফিরে আসে?
মাতদেব

এটি কি ওয়াইফাই নয়, মোবাইল ডেটে সংযুক্ত ডিভাইসের জন্য কাজ করবে?
সের্গেই

না, এই পদ্ধতিটি কেবল তখনই কাজ করে যদি ডিভাইসটি ওয়াইফাই
মাতদেব

1

এখানে @ নীলেশ এবং @ এনারগুন্ডের কোটলিন সংস্করণ রয়েছে

  fun getIpAddress(): String {
    var ip = ""
    try {
        val wm = applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
        ip = Formatter.formatIpAddress(wm.connectionInfo.ipAddress)
    } catch (e: java.lang.Exception) {

    }

    if (ip.isEmpty()) {
        try {
            val en = NetworkInterface.getNetworkInterfaces()
            while (en.hasMoreElements()) {
                val networkInterface = en.nextElement()
                val enumIpAddr = networkInterface.inetAddresses
                while (enumIpAddr.hasMoreElements()) {
                    val inetAddress = enumIpAddr.nextElement()
                    if (!inetAddress.isLoopbackAddress && inetAddress is Inet4Address) {
                        val host = inetAddress.getHostAddress()
                        if (host.isNotEmpty()) {
                            ip =  host
                            break;
                        }
                    }
                }

            }
        } catch (e: java.lang.Exception) {

        }
    }

   if (ip.isEmpty())
      ip = "127.0.0.1"
    return ip
}

1
যদি বাস্তব প্রকল্পগুলিতে এটি আপনার কোড শৈলী হয় তবে আমি আপনাকে রবার্ট মার্টিন দ্বারা "ক্লিন কোড" পড়ার পরামর্শ দিচ্ছি
আহমেদ অ্যাডেল ইসমাইল

1

কোনও ডিভাইসে বেশ কয়েকটি আইপি ঠিকানা থাকতে পারে এবং একটি নির্দিষ্ট অ্যাপ্লিকেশনে ব্যবহৃত একটি আইপি নাও হতে পারে যা অনুরোধ গ্রহণকারী সার্ভারগুলি দেখতে পাবে। প্রকৃতপক্ষে, কিছু ব্যবহারকারী একটি ভিপিএন বা একটি প্রক্সি যেমন ক্লাউডফ্লেয়ার ওয়ার্প ব্যবহার করেন

যদি আপনার উদ্দেশ্যটি আপনার ডিভাইস থেকে অনুরোধগুলি প্রাপ্ত সার্ভারগুলির দ্বারা দেখানো আইপি ঠিকানাটি পেতে হয়, তবে জাভা ক্লায়েন্টের সাথে আইপ্রেজিস্ট্রি (অস্বীকৃতি: আমি সংস্থার পক্ষে কাজ করি) এর মতো কোনও আইপি জিওলোকেশন পরিষেবা সম্পর্কে জিজ্ঞাসা করা ভাল :

https://github.com/ipregistry/ipregistry-java

IpregistryClient client = new IpregistryClient("tryout");
RequesterIpInfo requesterIpInfo = client.lookup();
requesterIpInfo.getIp();

ব্যবহারে সত্যই সরল হওয়ার পাশাপাশি, আপনি অতিরিক্ত তথ্য যেমন দেশ, ভাষা, মুদ্রা, ডিভাইসের আইপি-র জন্য সময় অঞ্চল পেয়ে থাকেন এবং ব্যবহারকারী কোনও প্রক্সি ব্যবহার করছেন কিনা তা আপনি সনাক্ত করতে পারেন।


1

এটি ইন্টারনেটে এখন পর্যন্ত সবচেয়ে সহজ এবং সহজ উপায় ... সর্বপ্রথম, আপনার প্রকাশিত ফাইলে এই অনুমতিটি যুক্ত করুন ...

  1. "ইন্টারনেট"

  2. "ACCESS_NETWORK_STATE"

এটি ক্রিয়াকলাপের অনক্রিট ফাইলটিতে যুক্ত করুন ..

    getPublicIP();

এখন আপনার মেইনএক্টিভিটি.ক্লাসে এই ফাংশনটি যুক্ত করুন।

    private void getPublicIP() {
ArrayList<String> urls=new ArrayList<String>(); //to read each line

        new Thread(new Runnable(){
            public void run(){
                //TextView t; //to show the result, please declare and find it inside onCreate()

                try {
                    // Create a URL for the desired page
                    URL url = new URL("https://api.ipify.org/"); //My text file location
                    //First open the connection
                    HttpURLConnection conn=(HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(60000); // timing out in a minute

                    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

                    //t=(TextView)findViewById(R.id.TextView1); // ideally do this in onCreate()
                    String str;
                    while ((str = in.readLine()) != null) {
                        urls.add(str);
                    }
                    in.close();
                } catch (Exception e) {
                    Log.d("MyTag",e.toString());
                }

                //since we are in background thread, to post results we have to go back to ui thread. do the following for that

                PermissionsActivity.this.runOnUiThread(new Runnable(){
                    public void run(){
                        try {
                            Toast.makeText(PermissionsActivity.this, "Public IP:"+urls.get(0), Toast.LENGTH_SHORT).show();
                        }
                        catch (Exception e){
                            Toast.makeText(PermissionsActivity.this, "TurnOn wiffi to get public ip", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

            }
        }).start();

    }


urls.get (0) এ আপনার সার্বজনীন আইপি ঠিকানা রয়েছে contains
জিয়া মুহাম্মদ

আপনাকে অবশ্যই আপনার ক্রিয়াকলাপের ফাইলে এই জাতীয় ঘোষণা করতে হবে: অ্যারেলিস্ট <স্ট্রিং> ইউআরএলস = নতুন অ্যারেলিস্ট <স্ট্রিং> (); // প্রতিটি লাইন পড়তে
জিয়া মুহাম্মদ

0

যদি আপনার শাঁস থাকে; ifconfig eth0 x86 ডিভাইসের জন্যও কাজ করেছে


0

দয়া করে এই কোডটি পরীক্ষা করুন ... এই কোডটি ব্যবহার করে। আমরা মোবাইল ইন্টারনেট থেকে আইপি করব ...

for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }

0

আমি অ্যান্ড্রয়েড করি না, তবে আমি একে একে একে একে একে একে একে একে একে একে একে একে একে একেবারেই আলাদা করার চেষ্টা করব।

গুগলে একটি ক্যোয়ারী প্রেরণ করুন, এর মতো: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=my%20ip

এবং প্রতিক্রিয়া পোস্ট করা হয় এমন HTML ক্ষেত্রটি উল্লেখ করুন। আপনি সোর্স থেকে সরাসরি জিজ্ঞাসা করতে পারেন।

গুগল আপনার আবেদনের চেয়ে বেশি সময়ের জন্য সেখানে থাকতে পছন্দ করবে।

শুধু মনে রাখবেন, এটি হতে পারে যে আপনার ব্যবহারকারীর কাছে এই মুহুর্তে ইন্টারনেট নেই, আপনি কী হতে চান!

শুভকামনা


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

0

তুমি এটি করতে পারো

String stringUrl = "https://ipinfo.io/ip";
//String stringUrl = "http://whatismyip.akamai.com/";
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(MainActivity.instance);
//String url ="http://www.google.com";

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, stringUrl,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // Display the first 500 characters of the response string.
                Log.e(MGLogTag, "GET IP : " + response);

            }
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        IP = "That didn't work!";
    }
});

// Add the request to the RequestQueue.
queue.add(stringRequest);

0
 //    @NonNull
    public static String getIPAddress() {
        if (TextUtils.isEmpty(deviceIpAddress))
            new PublicIPAddress().execute();
        return deviceIpAddress;
    }

    public static String deviceIpAddress = "";

    public static class PublicIPAddress extends AsyncTask<String, Void, String> {
        InetAddress localhost = null;

        protected String doInBackground(String... urls) {
            try {
                localhost = InetAddress.getLocalHost();
                URL url_name = new URL("http://bot.whatismyipaddress.com");
                BufferedReader sc = new BufferedReader(new InputStreamReader(url_name.openStream()));
                deviceIpAddress = sc.readLine().trim();
            } catch (Exception e) {
                deviceIpAddress = "";
            }
            return deviceIpAddress;
        }

        protected void onPostExecute(String string) {
            Lg.d("deviceIpAddress", string);
        }
    }

0

সমস্ত সততার সাথে আমি কোড সুরক্ষার সাথে কেবল সামান্য পরিচিত, তাই এটি হ্যাক-ইশ হতে পারে। তবে আমার পক্ষে এটি করার সবচেয়ে বহুমুখী উপায়:

package com.my_objects.ip;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyIpByHost 
{
  public static void main(String a[])
  {
   try 
    {
      InetAddress host = InetAddress.getByName("nameOfDevice or webAddress");
      System.out.println(host.getHostAddress());
    } 
   catch (UnknownHostException e) 
    {
      e.printStackTrace();
    }
} }

0

WifiManagerএকটি ভাল কোটলিন সমাধানে ওয়াইফাই আইপি পেতে কিছু ধারণা সংকলন:

private fun getWifiIp(context: Context): String? {
  return context.getSystemService<WifiManager>().let {
     when {
      it == null -> "No wifi available"
      !it.isWifiEnabled -> "Wifi is disabled"
      it.connectionInfo == null -> "Wifi not connected"
      else -> {
        val ip = it.connectionInfo.ipAddress
        ((ip and 0xFF).toString() + "." + (ip shr 8 and 0xFF) + "." + (ip shr 16 and 0xFF) + "." + (ip shr 24 and 0xFF))
      }
    }
  }
}

বিকল্পভাবে আপনি আইপি 4 লুপব্যাক ডিভাইসের আইপি অ্যাড্রেসগুলি এর মাধ্যমে পেতে পারেন NetworkInterface:

fun getNetworkIp4LoopbackIps(): Map<String, String> = try {
  NetworkInterface.getNetworkInterfaces()
    .asSequence()
    .associate { it.displayName to it.ip4LoopbackIps() }
    .filterValues { it.isNotEmpty() }
} catch (ex: Exception) {
  emptyMap()
}

private fun NetworkInterface.ip4LoopbackIps() =
  inetAddresses.asSequence()
    .filter { !it.isLoopbackAddress && it is Inet4Address }
    .map { it.hostAddress }
    .filter { it.isNotEmpty() }
    .joinToString()

-2

আমি এটি যা পরীক্ষা করেছি তার ভিত্তিতে আমার প্রস্তাব

import java.net.*;
import java.util.*;

public class hostUtil
{
   public static String HOST_NAME = null;
   public static String HOST_IPADDRESS = null;

   public static String getThisHostName ()
   {
      if (HOST_NAME == null) obtainHostInfo ();
      return HOST_NAME;
   }

   public static String getThisIpAddress ()
   {
      if (HOST_IPADDRESS == null) obtainHostInfo ();
      return HOST_IPADDRESS;
   }

   protected static void obtainHostInfo ()
   {
      HOST_IPADDRESS = "127.0.0.1";
      HOST_NAME = "localhost";

      try
      {
         InetAddress primera = InetAddress.getLocalHost();
         String hostname = InetAddress.getLocalHost().getHostName ();

         if (!primera.isLoopbackAddress () &&
             !hostname.equalsIgnoreCase ("localhost") &&
              primera.getHostAddress ().indexOf (':') == -1)
         {
            // Got it without delay!!
            HOST_IPADDRESS = primera.getHostAddress ();
            HOST_NAME = hostname;
            //System.out.println ("First try! " + HOST_NAME + " IP " + HOST_IPADDRESS);
            return;
         }
         for (Enumeration<NetworkInterface> netArr = NetworkInterface.getNetworkInterfaces(); netArr.hasMoreElements();)
         {
            NetworkInterface netInte = netArr.nextElement ();
            for (Enumeration<InetAddress> addArr = netInte.getInetAddresses (); addArr.hasMoreElements ();)
            {
               InetAddress laAdd = addArr.nextElement ();
               String ipstring = laAdd.getHostAddress ();
               String hostName = laAdd.getHostName ();

               if (laAdd.isLoopbackAddress()) continue;
               if (hostName.equalsIgnoreCase ("localhost")) continue;
               if (ipstring.indexOf (':') >= 0) continue;

               HOST_IPADDRESS = ipstring;
               HOST_NAME = hostName;
               break;
            }
         }
      } catch (Exception ex) {}
   }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.