【问题标题】:Android Java App - java.net.SocketException: Permission deniedAndroid Java 应用程序 - java.net.SocketException:权限被拒绝
【发布时间】:2013-05-12 17:39:35
【问题描述】:

在我的安卓应用中使用 MYSQL:

主活动。

public class MainActivity extends Activity implements OnClickListener {

Button login;
EditText username, password;
TextView status;
HttpPost httppost;
StringBuffer buffer;
HttpResponse response;
HttpClient httpclient;
List<NameValuePair> nameValuePair;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setup();
}

private void setup() {
    // TODO Auto-generated method stub

    username = (EditText) findViewById(R.id.username);
    password = (EditText) findViewById(R.id.password);
    login = (Button) findViewById(R.id.login);
    status = (TextView) findViewById(R.id.status);
    login.setOnClickListener(this); 
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    switch(v.getId()) {
    case R.id.login:

        login();

        break;
    }
    }

private void login() {
    // TODO Auto-generated method stub
    try {
        httpclient= new DefaultHttpClient();
        httppost= new HttpPost("http://109.74.245.109/~profiled/android/index.php"); 
    //  Adding Data:
        nameValuePair = new ArrayList<NameValuePair>(1);
    //  Always use the same variable name for posting i.e the android side variable name and php side variable name should be similar,
        nameValuePair.add(new BasicNameValuePair("username",username.getText().toString().trim()));
        nameValuePair.add(new BasicNameValuePair("password",password.getText().toString().trim()));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePair));
    // Execute HTTP Post Request
        response = httpclient.execute(httppost);



        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        final String response = httpclient.execute(httppost, responseHandler);
        status.setText(""+response);
        if(response.equalsIgnoreCase("No user found")) {

            startActivity(new Intent(MainActivity.this, UserPage.class));
        }


        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是我的错误:

05-17 13:39:25.309: W/System.err(292): java.net.SocketException: Permission denied
05-17 13:39:25.318: W/System.err(292):  at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method)
05-17 13:39:25.318: W/System.err(292):  at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186)
05-17 13:39:25.318: W/System.err(292):  at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265)
05-17 13:39:25.318: W/System.err(292):  at java.net.Socket.checkClosedAndCreate(Socket.java:873)
05-17 13:39:25.318: W/System.err(292):  at java.net.Socket.connect(Socket.java:1020)
05-17 13:39:25.333: W/System.err(292):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
05-17 13:39:25.337: W/System.err(292):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
05-17 13:39:25.337: W/System.err(292):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
05-17 13:39:25.337: W/System.err(292):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
05-17 13:39:25.337: W/System.err(292):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
05-17 13:39:25.337: W/System.err(292):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
05-17 13:39:25.337: W/System.err(292):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
05-17 13:39:25.337: W/System.err(292):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
05-17 13:39:25.337: W/System.err(292):  at com.profiledt.helloworld.MainActivity.login(MainActivity.java:88)
05-17 13:39:25.337: W/System.err(292):  at com.profiledt.helloworld.MainActivity.onClick(MainActivity.java:70)
05-17 13:39:25.337: W/System.err(292):  at android.view.View.performClick(View.java:2408)
05-17 13:39:25.337: W/System.err(292):  at android.view.View$PerformClick.run(View.java:8816)
05-17 13:39:25.337: W/System.err(292):  at android.os.Handler.handleCallback(Handler.java:587)
05-17 13:39:25.337: W/System.err(292):  at android.os.Handler.dispatchMessage(Handler.java:92)
05-17 13:39:25.357: W/System.err(292):  at android.os.Looper.loop(Looper.java:123)
05-17 13:39:25.357: W/System.err(292):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-17 13:39:25.357: W/System.err(292):  at java.lang.reflect.Method.invokeNative(Native Method)
05-17 13:39:25.357: W/System.err(292):  at java.lang.reflect.Method.invoke(Method.java:521)
05-17 13:39:25.357: W/System.err(292):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-17 13:39:25.357: W/System.err(292):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-17 13:39:25.357: W/System.err(292):  at dalvik.system.NativeStart.main(Native Method)

我不完全理解这个错误,但由于它是权限,我得出了一些结论:

  • 无法连接mysql数据库
  • 与 IP 地址和我的服务器有关吗?

【问题讨论】:

标签: java android socketexception adk


【解决方案1】:

将此添加到您的清单并检查。

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

【讨论】:

  • 为什么要访问网络状态?它需要互联网权限而不是网络状态来访问互联网
  • 嗨,我将它添加到 activity_main.xml 并且应用程序无法运行,我得到了这个:很多错误:pastebin.com/xZSAtnj6
  • 你需要把这个添加到AndroidMainfest.xml
  • 嗨,Juned,我将它添加到了 下的 AndroidManifest.xml 中,但我仍然遇到同样的错误
  • ...
【解决方案2】:
<uses-permission android:name="android.permission.ACCESS_INTERNET"/>

我还编写了一个库,可以帮助您在不同的线程中执行此操作,而不是您正在执行的操作(在 UI 线程中运行请求)。

也许你会喜欢它。如果没有,还有其他选择

https://github.com/darko1002001/android-rest-client

希望这会有所帮助。

编辑

通常有两个组件在起作用。您不直接连接到数据库,而是在您的情况下创建一个 PHP 脚本,该脚本将连接到数据库并充当可以接受请求并返回 JSON 的 WebService。 Android 应用程序充当客户端,它调用您的 PHP 网络服务,该服务连接到数据库、读取并返回结果。

所以你有:

client(android) Web 服务 (PHP) MySql 数据库

android 不会直接进入数据库。

一个简单的测试是 PC 浏览器。如果您输入完整的 url 并在浏览器中按 enter,您应该会得到与在 android 上相同的确切响应。

这意味着您已经向您的网络服务执行了一个 GET 请求,就像所有浏览器输入操作一样。

在您的情况下,您似乎正在执行 POST 请求。

阅读有关 REST Web 服务的一些文章,以获取有关应该如何设置的更多信息。

希望这会有所帮助。

【讨论】:

  • 嗨 DArkO,我对这一切还是有点陌生​​,这是否允许我连接到 mysql 数据库并回显所有信息?谢谢
  • 嘿 DArkO,这就是我一直在做的 :) 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2015-09-26
  • 2015-03-25
  • 2023-03-09
  • 2018-01-09
相关资源
最近更新 更多