有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

创建ParseObject时出现java 安卓 i/o故障异常

我在AWS上启动了一个Parse server实例,希望在其中存储来自安卓应用程序的数据

在模块的gradle中,我在dependencies下插入了下面的

implementation 'com.parse.bolts:bolts-tasks:1.4.0'
implementation 'com.parse:parse-安卓:1.17.3'

并创建了一个初始化解析配置的新应用程序

import 安卓.app.Application;

import 安卓.app.Application;
import 安卓.util.Log;

import com.parse.Parse;
import com.parse.ParseACL;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseUser;
import com.parse.SaveCallback;

public class StarterApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // Enable Local Datastore.
        Parse.enableLocalDatastore(this);

        // Add your initialization code here
        Parse.initialize(new Parse.Configuration.Builder(getApplicationContext())
                .applicationId(myAppId)
                .clientKey(myClientKey)
                .server(serverAddress)
                .build()
        );

        ParseObject object = new ParseObject("ExampleObject");
//        object.put("id", "123");
//        object.put("name", "jack");



        object.saveInBackground(new SaveCallback () {
            @Override
            public void done(ParseException ex) {
                if (ex == null) {
                    Log.i("Parse Result", "Successful!");
                } else {
                    Log.i("Parse Result", "Failed" + ex.toString());
                }
            }
        });


        ParseUser.enableAutomaticUser();

        ParseACL defaultACL = new ParseACL();
        defaultACL.setPublicReadAccess(true);
        defaultACL.setPublicWriteAccess(true);
        ParseACL.setDefaultACL(defaultACL, true);

    }
}

这对我来说是全新的,我正在学习一门3年的Android开发课程。当我运行此操作时,异常会不断被捕获,并出现相同的错误:

com.parse.ParseRequest$ParseRequestException: i/o failure

我的安卓清单如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    package="com.example.parsetest2">

    <uses-permission 安卓:name="安卓.permission.INTERNET" />
    <uses-permission 安卓:name="安卓.permission.ACCESS_NETWORK_STATE" />
    <uses-permission 安卓:name="安卓.permission.READ_EXTERNAL_STORAGE" />

    <uses-permission 安卓:name="安卓.permission.ACCESS_FINE_LOCATION" />

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

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

</manifest>

错误来自哪里?怎么解决呢?


共 (3) 个答案

  1. # 1 楼答案

    固定的。出于某种原因,来自AWS服务的Parse server仪表板。例如,http://ec2-18-220-53-0.us-east-2.compute.amazonaws.com没有应用程序类别,您会注意到它只显示我的Bitnami解析API,没有应用程序选项。这意味着,首先,您无法将数据传递到服务器上本应可用的任何应用程序。其次,将服务器连接到您的android应用程序将不起作用,因为现在主密钥实际上与最近的客户端密钥不同

    取而代之的是AWS使用Back4App,其工作方式与AWS完全相同。Back4App是基于Parse Server平台的可扩展后端服务

    优点:

    您不需要使用SSH客户端连接到服务器并检索应用程序ID、客户端密钥或服务器url。一切都在仪表板上的服务器设置下

    转至Back4App:

    步骤1:在back4app上创建帐户

    步骤2:创建一个应用程序,您可以根据本教程将其命名为instagramandroid

    第三步:按照链接中的所有剩余信息进行操作,每件事都会很顺利https://www.back4app.com/docs/pages/android/how-to-build-an-android-app-on-back4app

    注意:添加解析依赖项时,最新的是1.17.3。除非你想使用1.20.0,否则这会很好用,我试过了,但没有真正起作用。添加它,就像您通常在gradle文件中添加依赖项一样:“实现com”。解析:解析android:1.17.3'

  2. # 2 楼答案

    主要问题是您没有连接到服务器

    [1]-确保已将应用程序id和客户端id添加到AndroidManifest

    **在此处更改应用程序Id,在此处更改客户端密钥,如“ISIGDGU4YGCE673”

    <meta-data
                android:name="com.parse.SERVER_URL"
                android:value="https://parseapi.back4app.com" />
            <meta-data
                android:name="com.parse.APPLICATION_ID"
                android:value="_App_Id_Here_" /> //<- put your key
            <meta-data
                android:name="com.parse.CLIENT_KEY"
                android:value="_client_Key_here_" /> //<- put your key
    

    [2]-将存储库{ maven { url 'https://jitpack.io' } }添加到build.gradle(Project:xyz)

    [3]-确保您更改了。解析服务器、AppId和clientKey的服务器字段:

    Parse.initialize(new Parse.Configuration.Builder(getApplicationContext())
      .applicationId(myAppId)//"myAppId" should be sth like ->"ASHWD63787EDXSG8"
      .clientKey(myClientKey)//should be sth like ->"tdf29yedih287823"
      .server(serverAddress)//something like-> "https://parseapi.back4app.com"
      .build()
            );
    

    从服务器的仪表板设置中获取这些密钥->;钥匙

  3. # 3 楼答案

    如果托管解析服务器位于HTTP服务器而不是HTTPS上,也可能发生此问题。因为Android 9.0及以上版本不允许您通过HTTP使用明文信息。因此,如果是这样,您可以执行以下操作:

    • 在清单文件和清单标记中添加android:targetSandboxVersion="1"行。所以看起来像
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.app"
       android:targetSandboxVersion="1">
    
    • 在清单文件中,在应用程序标记中添加android:usesCleartextTraffic="true"行。所以看起来像
    <application
            android:name=".Example"
            android:allowBackup="true"
            ....
            android:usesCleartextTraffic="true">