Cloudinary - 缺少必需的参数

Cloudinary - Missing required parameter

我遇到了某种错误,在查看 Cloudinary Docs.、这里的其他几个 post 和其他网站后,加上阅读堆栈跟踪,我假设我的语法是将图像上传到服务器不是应该的样子,虽然我从文档中的示例中清楚地理解,但我无法根据堆栈跟踪中的错误应用正确的方法。

我的堆栈跟踪给了我这个错误: 原因:java.lang.RuntimeException:缺少必需的参数 - 文件

我的代码如下:

public class Upload extends AppCompatActivity implements View.OnClickListener {


public static final int RESULT_LOAD_IMAGE = 1;
ImageView imgToUpload;
Button buttonUploadSubmit;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.upload);
    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    imgToUpload = (ImageView) findViewById(R.id.imgToUpload);
    buttonUploadSubmit = (Button) findViewById(R.id.ButtonUploadSubmit);

    imgToUpload.setOnClickListener(this);
    buttonUploadSubmit.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.imgToUpload:
            Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);
            break;

        case R.id.ButtonUploadSubmit:
            UploadTask uploadTask = new UploadTask();
            uploadTask.execute();

            break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri selectedVideo = data.getData();
    imgToUpload.setImageURI(selectedVideo);
    Toast.makeText(getApplicationContext(), selectedVideo.toString(), Toast.LENGTH_LONG).show();
    Toast.makeText(getApplicationContext(), imgToUpload.toString(), Toast.LENGTH_LONG).show();
}



class UploadTask extends AsyncTask<String, Void, Void> {

    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(Upload.this);
        progressDialog.setTitle("Upload in Progress ...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(100);
        progressDialog.setProgress(0);
        progressDialog.show();
    }

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

       Map config = new HashMap();
                       config.put("cloud_name", "xxxxxxx");
                       config.put("api_key", "xxxxxxxxxxxxxx");
                       config.put("api_secret", "xxxxxxxxxxx");
                       Cloudinary cloudinary = new Cloudinary(config);
                       try {
                           cloudinary.uploader().upload(imgToUpload, ObjectUtils.asMap("resource_type", "auto"));
                       } catch (IOException e) {
                           e.printStackTrace();
                       }


        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
    }


}

} 我猜 imgToUpload 在 cloudaniry 上传方法中不被接受:

cloudinary.uploader().upload( imgToUpload,
                ObjectUtils.asMap("resource_type", "auto"));

因为它不是"file ",根据堆栈跟踪,这就是我所缺少的,因此,如果有人能证实这一点,我将不胜感激,请指导我使用此方法的正确语法,或者使用从 ImageView 中选择的图片创建文件并将该文件包含在 Cloudinary 上传方法中的方法?

堆栈跟踪:

  03-15 14:32:14.260 17683-20341/net.we4x4.we4x4 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
 Process: net.we4x4.we4x4, PID: 17683
                                                             java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                 at android.os.AsyncTask.done(AsyncTask.java:300)
                                                                 at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                 at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                 at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                 at java.lang.Thread.run(Thread.java:841)
                                                              Caused by: java.lang.RuntimeException: Missing required parameter - file
                                                                 at com.cloudinary.android.UploaderStrategy.callApi(UploaderStrategy.java:106)
                                                                 at com.cloudinary.Uploader.callApi(Uploader.java:22)
                                                                 at com.cloudinary.Uploader.upload(Uploader.java:55)
                                                                 at net.we4x4.we4x4.Upload$UploadTask.doInBackground(Upload.java:100)
                                                                 at net.we4x4.we4x4.Upload$UploadTask.doInBackground(Upload.java:77)
                                                                 at android.os.AsyncTask.call(AsyncTask.java:288)
                                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                 at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231) 
                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                 at java.lang.Thread.run(Thread.java:841) 

所以我能够上传图片,提供以下路径: /storage/emulated/0/Pictures/Screenshots/Screenshot_2016-03-09-15-40-13.png

但是通过手动将其写入上传方法,我从 phone 手动获取代码,只是查看图片的详细信息,因此我现在的问题是如何获取此路径ImageView 中显示的图片 ?

进度条也只是在 0 上移动并且没有改变,我不得不检查 website/server 以查看图片是否已上传......我不确定是什么导致进度条不是 function/freez !?

如有任何指导,我将不胜感激。

好吧,问题已解决,出于某种原因,从一个 API 到另一个 API 获取文件图像的真实路径有点棘手,不知道为什么,或者如果有另一种简单的方法可以做到这一点我还没有发现,但是根据几个 post s 例如: android get real path by Uri.getPath()

考虑到 API.

,您可以通过 post 中给出的方法转换 Uri 来获取实际图像路径

并且由于 Cloudinary 要求上传文件,所以提供文件在设备上的实际路径,或者他们的文档中提到的其他方式。这个障碍必须通过获取文件的实际路径来解决 http://cloudinary.com/documentation/upload_images#api_example_1

以下是在 Android Studio 中上传文件到 Cloudinary 的代码;

    @Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.imgToUpload:
            Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);

            break;
        case R.id.ButtonUploadSubmit:
            UploadTask uploadTask = new UploadTask();
            uploadTask.execute(String.valueOf(vidToUpload));

            break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null) {
        Uri selectedImgPath = data.getData();
        RealImgPath = Uri.parse(getPath(selectedImgPath));
        Toast.makeText(getApplicationContext(), " " + RealImgPath, Toast.LENGTH_LONG).show();

    }

}

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}


class UploadTask extends AsyncTask<String, Void, Void> {

    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(Upload.this);
        progressDialog.setTitle("Upload in Progress ...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(100);
        progressDialog.setProgress(0);
        progressDialog.show();
    }

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

        Map config = new HashMap();
        config.put("cloud_name", "xxxxxx");
        config.put("api_key", "xxxxxxxxxxxxxxx");
        config.put("api_secret", "xxxxxxxxxxxxxxxxxxx");
        Cloudinary cloudinary = new Cloudinary(config);
        try {
            cloudinary.uploader().upload(""+RealImgPath, ObjectUtils.asMap("resource_type", "auto"));
        } catch (IOException e) {
            e.printStackTrace();
        }


        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        progressDialog.dismiss();
        super.onPostExecute(aVoid);
    }
}

我希望这对某些人有用,并让他们免于我为了实现这一目标而不得不经历几天的发现探险,因为 Cloudinary Docs。有点缺少一些特定的信息,Stakcoverflow 缺少一些关于 Cloudinary 特定 post 的 post,考虑到我一路学习也延长了这个简单的问题。

需要注意的是,上面的代码仍然不完美,因为进度对话框仍然无法正常运行(弹出并冻结 - 没有进度)并且从意图图库中选择的图片不会显示在 ImageView 上应该是这样,现在需要解决这个问题。

您还可以将 ImageView 结果转换为 Base64 并将字符串发送到 Cloudinary。

否则,您可以提供https://github.com/cloudinary/cloudinary_java/blob/master/cloudinary-android/src/main/java/com/cloudinary/android/UploaderStrategy.java#L65-L77

中定义的任何一种类型