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。
中定义的任何一种类型
我遇到了某种错误,在查看 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。
中定义的任何一种类型