【问题标题】:Android - execute php script from assetsAndroid - 从资产执行 php 脚本
【发布时间】:2015-11-02 03:12:59
【问题描述】:

我需要在我的应用程序中使用带有文本输出的 PHP 脚本。 我有以下代码:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;


public class Fourth_Fragment extends Fragment {
    View myView4;
    //TextView textl;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myView4 = inflater.inflate(R.layout.fourth_layout, container, false);

        //textl = (TextView)myView4.findViewById(R.id.LoungeTest);
        //textl.setText(outputlog);
        final String url = "file:///android_asset/lounge.php";
        new Thread() {
            @Override
            public void run() {
                try {
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpResponse response = httpclient.execute(new HttpGet(url));
                    StatusLine statusLine = response.getStatusLine();
                    if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                        ByteArrayOutputStream out = new ByteArrayOutputStream();
                        try {
                            response.getEntity().writeTo(out);
                            out.close();
                        } catch (IOException e) {
                        }
                        String responseString = out.toString();
                        //..more logic
                    } else {
                        //Closes the connection.
                        try {
                            response.getEntity().getContent().close();
                            throw new IOException(statusLine.getReasonPhrase());
                        } catch (IOException e) {
                        }
                    }
                }
                catch (ClientProtocolException e)
                {

                }
                catch (IOException e)
                {

                }
            }
        }.start();

        return myView4;
    }




}

这是 logcat:

11-01 19:47:24.784 1454-1454 W/System.err: java.io.IOException: Error running exec(). Command: [php, android.content.res.AssetManager$AssetInputStream@1e44a661] Working Directory: null Environment: null
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.ProcessManager.exec(ProcessManager.java:211)
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.Runtime.exec(Runtime.java:173)
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.Runtime.exec(Runtime.java:246)
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.Runtime.exec(Runtime.java:189)
11-01 19:47:24.794 1454-1454 W/System.err:     at myapp.test.Fourth_Fragment.execPHP(Fourth_Fragment.java:48)
11-01 19:47:24.794 1454-1454 W/System.err:     at myapp.test.Fourth_Fragment.onCreateView(Fourth_Fragment.java:33)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1016)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1197)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1562)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:483)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.os.Looper.loop(Looper.java:135)
11-01 19:47:24.794 1454-1454 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5253)
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
11-01 19:47:24.794 1454-1454 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-01 19:47:24.794 1454-1454 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
11-01 19:47:24.794 1454-1454 W/System.err: Caused by: java.io.IOException: Permission denied
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.ProcessManager.exec(Native Method)
11-01 19:47:24.794 1454-1454 W/System.err:     at java.lang.ProcessManager.exec(ProcessManager.java:209)
11-01 19:47:24.794 1454-1454 W/System.err:  ... 19 more

AndroidManifest:

...
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
...

那么有什么办法,如何在带有文本输出(作为字符串)的 Android java App 中执行 PHP 脚本(位于 assets 文件夹中)?谢谢

【问题讨论】:

标签: java php android


【解决方案1】:

如何在带有文本输出(作为字符串)的 Android java App 中执行 PHP 脚本(位于 assets 文件夹中的文件)?

不是真的。 Android 没有内置 PHP 解释器。 PHP是Web服务器常用的一种技术; Android 也没有内置 Web 服务器。

欢迎您尝试寻找适用于 Android 的 PHP 解释器,然后尝试弄清楚如何使用它来执行您的 PHP 脚本。最有可能的是,首先摆脱 PHP 脚本会为您提供更好的服务。

【讨论】:

    【解决方案2】:

    首先,我认为你的网址是错误的,

    final String url = "file:///android_asset/lounge.php";
    

    应该是这样的

    final String url = "http://127.0.0.1/android_asset/lounge.php"; 
    

    其中 127.0.0.1 是用于 localhost 的 ip。

    用于本地系统。

    【讨论】:

    • 请解释使用localhost URL 将如何允许OP 在Android 设备上执行包含在assets/ 中的PHP 脚本。
    • 无法运行资产文件夹中的脚本。您的脚本必须在服务器文件夹中才能运行。
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2011-07-16
    • 2015-10-26
    • 2016-02-11
    • 2016-07-02
    相关资源
    最近更新 更多