java.net.SocketException: सॉकेट विफल: EPERM (ऑपरेशन की अनुमति नहीं है)


143

मैं कई गतिविधियों के साथ एक एंड्रॉइड स्टूडियो प्रोजेक्ट पर काम कर रहा हूं। मैं वर्तमान में जावा सर्वर से लोकलहोस्ट पर आउटपुट पढ़ने की कोशिश कर रहा हूं, लेकिन सॉकेट की अनुमति के कारण यह क्रैश हो रहा है।

मैंने एक नया प्रोजेक्ट बनाया है, ठीक उसी कोड का इस्तेमाल किया है और पूरी तरह से काम किया है। इसलिए मुझे समझ नहीं आ रहा है कि मैं अपने प्रोजेक्ट पर काम करने को तैयार क्यों नहीं हूं।

public class LoginActivity extends AppCompatActivity {


String apiUrl = "http://10.0.2.2:8080/ProyectService/Servlet?action=login";
EditText username;
EditText password;
AlertDialog dialog;
Usuario session;

@Override
public void onCreate(Bundle savedInstanceState) {
    // Inicializacion de ventana
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    getSupportActionBar().hide();

    // Inicializacion de componentes
    username = findViewById(R.id.username);
    password = findViewById(R.id.password);

    // Inicializacion de funcionalidad de botones
    Button button= (Button) findViewById(R.id.login);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            UserLoginTask mAuthTask = new UserLoginTask();
            mAuthTask.execute();
        }
    });

    password = findViewById(R.id.password);
    createAlertDialog("Usuario o Contraseña Incorrectos");
    }

    private void createAlertDialog(String message){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(message)
            .setTitle("Error");
    dialog = builder.create();
    }



    // ASYNCRONUS NETWORK PROCESS

    public class UserLoginTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
    }


    @Override
    protected String doInBackground(String... params) {

        // implement API in background and store the response in current variable
        String current = "";
        try {
            URL url;
            HttpURLConnection urlConnection = null;
            try {
                url = new URL(apiUrl);
                System.out.println(apiUrl);
                urlConnection = (HttpURLConnection) url
                        .openConnection();

                InputStream in = urlConnection.getInputStream();

                InputStreamReader isw = new InputStreamReader(in);

                int data = isw.read();
                while (data != -1) {
                    current += (char) data;
                    data = isw.read();
                    //System.out.print(current);

                }
                System.out.print(current);
                // return the data to onPostExecute method
                return current;

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            return "Exception: " + e.getMessage();
        }
        return current;
        }
    }

    protected void onPostExecute(String success) {
        Log.i(success, "");
       //attemptLogin();
    }
}

मुझे उम्मीद है कि यह डेटा पढ़ने के लिए है, लेकिन यह इस लाइन पर दुर्घटनाग्रस्त हो जाता है:

InputStream in = urlConnection.getInputStream();

यह त्रुटि आउटपुट है:

java.net.SocketException: socket failed: EPERM (Operation not permitted)
at java.net.Socket.createImpl(Socket.java:492)
at java.net.Socket.getImpl(Socket.java:552)
at java.net.Socket.setSoTimeout(Socket.java:1180)
at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
at com.example.controller.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:114)
at com.example.controller.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:93)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)

जवाबों:


392

सॉल्व्ड: मुझे बस इतना करना था कि ऐप को एमुलेटर से अनइंस्टॉल करके फिर से चलाना है।


8
यह मेरे लिए भी काम किया, कभी पाया कि यह पहली जगह में क्यों हो रहा था?
विकास पांडेय

9
मेरे मामले में मुझे ACCESS_NETWORK_STATE अनुमति प्रदान करनी थी। प्रकट करने के लिए <उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.ACCESS_NETWORK_STATE" /> जोड़ें। और भी अनइंस्टॉल करें
sk md

3
मुझे भी। यह अजीब है कि सवाल इतना युवा है। शायद यह एक बग है।
user1511417

1
एक एमुलेटर से हटाए गए एप्लिकेशन को स्थापित करें और फिर से मेरी समस्या को हल करें, धन्यवाद। लगता है कि फ़ाइल सिस्टम में कैश को कुछ फायर करता है और उसका पुन: उपयोग करता है, मुझे लगता है कि स्पष्ट एप्लिकेशन डेटा भी एक समस्या को हल करेगा।
ऑनग्राउंड

1
हो सकता है कि अनुमति पहले से ही कैश की गई हो और उसे बार-बार बर्बाद कर रहा हो और फिर अनुमति अपडेट नहीं कर रहा हो और केवल src फाइल को अपडेट कर रहा हो? वह फिर से स्थापना में मदद की है।
आतिफ अब्बासी

38

बस एमुलेटर से ऐप को अनइंस्टॉल करें फिर चलाएं और यह काम करेगा मेरे पास एक ही मुद्दा था

एप्लिकेशन को अपनी परियोजना को चलाने के लिए जब "एप्लिकेशन बंद हो गया था" संदेश प्रकट होता है "एप की जानकारी पर क्लिक करें" तब unistall


1
मैं नहीं जानता कि कैसे, लेकिन यह काम करता है। दिसंबर 2019 में पोस्टिंग। हालांकि यह काम करता है, यह जानने के लिए उत्सुक है।
राजकिरण

30

सबसे पहले आपको अपने एंड्रॉइड मैनिफ़ेस्ट .xml को बदलने की आवश्यकता है लेकिन इस क्रिया के बाद आपको एप्लिकेशन को अनइंस्टॉल करना होगा और इसे फिर से चलाना होगा। https://developer.android.com/training/basics/network-ops/connecting

और यहाँ कोड:

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

में AndroidManifest.xml


2
यह सच है, हालांकि अगर वह पहले से ही सेट है और अभी भी वही त्रुटि हो रही है - जैसा कि ऊपर बताया गया है - डिवाइस पर ऐप हटाएं और इसे फिर से इंस्टॉल करें।
व्लादिस्लाव वर्स्लावन्स

11

मुझे एमुलेटर से ऐप को अनइंस्टॉल करना पड़ा और फिर सब कुछ काम करने लगा। मुझे सिर्फ AndroidManifest.xml पर फोलोइंग अनुमति की आवश्यकता थी

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


2

android:usesCleartextTraffic="true"मैनिफ़ेस्ट फ़ाइल में सेट करें । अनुमति जोड़ें INTERNET। ऐप अनइंस्टॉल करें और फिर दोबारा इंस्टॉल करें।


0

अगर किसी के पास अभी भी यह समस्या है तो मैंने इसका सामना किया जब मैंने वीपीएन का इस्तेमाल किया और सेलुलर चालू होने पर वाईफाई से कनेक्ट करने की कोशिश की। मैं Anyconnect VPN क्लाइंट का उपयोग कर रहा था। समाधान बायपास को सक्षम करने के लिए है जो आपको एक विशिष्ट नेटवर्क के लिए सॉकेट को बांधने देगा यदि यह वही है जो आप खोज रहे हैं।

AnyConnect केवल allowBypass का उपयोग करता है यदि यह अपने प्रबंधित प्रतिबंध (EMM द्वारा) में इस कुंजी के माध्यम से कॉन्फ़िगर किया गया है: vpn_connection_allow_bypass।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.