Android应用引擎后端实体上传

时间:2014-07-21 23:25:12

标签: android google-app-engine

我正在尝试按照给出的教程; https://cloud.google.com/developers/articles/how-to-build-mobile-app-with-app-engine-backend-tutorial

我也在修改它以满足我的需求。我设法按照教程项目但是当我在后端尝试自己的实体类时,我遇到了一些错误。例如;

这是我创建的名为User的实体类;

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String name;
private String imageType;
private Blob image;

public Key getKey() {
    return key;
}
public String getName() {
    return this.name;
}

public String getImageType() {
    return imageType;
}

public byte[] getImage() {
    if (image == null) {
        return null;
    }
    return image.getBytes();
}

public void setName(String name) {
    this.name = name;
}

public void setImageType(String imageType) {
    this.imageType = imageType;
}

public void setImage(byte[] bytes) {
    this.image = new Blob(bytes);
}
}

然后我定义了一个AsyncTask,正如教程中所解释的那样。我想拍照,在设备中捕捉其路径并将该照片上传到Datastore。这是我的doInBaackground方法;

@Override
protected Void doInBackground(Void... params) {
    User user = new User();
    user.setName("Burak Çopur");
    Userendpoint.Builder builder = new Userendpoint.Builder(
            AndroidHttp.newCompatibleTransport(), 
            new JacksonFactory(),
            null);

    builder = CloudEndpointUtils.updateBuilder(builder);
    Userendpoint endpoint = builder.build(); 
    try {
        endpoint.insertUser(user).execute();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

最后,我在相机活动返回之后调用此方法,如下所示;

@Override
protected void onActivityResult(int requestCode, int resultCode, 
    Intent data) {
    // Handle activity resulting from IMAGE_CAPTURE
    if(requestCode == REQUEST_IMAGE_CAPTURE){
        new UserTask().execute(getApplicationContext());
        File myFile = new File(mCurrentPhotoPath);
        if(myFile.exists())
            myFile.delete();
    }
}

我检查了一些类似的问题,但我找不到解决方案。我想先看看名字字段存储。然后我可以继续前进。这是我得到的错误代码的一部分;

07-22 02:21:28.941: W/System.err(4852): 
  com.google.api.client.googleapis.json.GoogleJsonResponseException: 
503 Service Unavailable

这是有问题的代码行;

endpoint.insertUser(user).execute();

我不是在本地调试服务器中尝试这样做,因为它在教程中有解释。我想看看它在云上是如何工作的,所以通过eclipse部署了我的后端项目。我的管理页面显示我的应用正在运行我还将LOCAL_ANDROID_RUN设置为false,以便它不会尝试使用本地调试服务器。可能问题是我没有在onCreate方法中调用new EndpointsTask().execute();,因为它在教程中完成了吗?过去的一些问题可能暗示了这样的事情,但我看不出原因。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我想我得到了这个。这实际上非常简单。如果您收到此错误,则表示您的后端连接存在问题。大多数情况下,这是因为您在生成后端时未提供有关项目的完整信息。确保您已输入;

来自项目页面的证书的

-API密钥

- 项目编号

- 项目名称

- 项目版本

正确。另外,你运气不好。或者您也可以按照原始帖子中给出的教程在本地服务器上工作。在任何一种情况下,请务必注释掉教程中指定的部分。我不知道为什么,但不起作用。

此外,您可能正在尝试存储Datastore API不支持的数据类型。对于那个看;

com.google.appengine.api.datastore.DataTypeUtils

也不允许存储大于1MB的Blob。这些都是我能找到的关于这个问题的部分。确保你的后端有一个有效的连接,并确保你满足上述规则。