【问题标题】:Upload Image from gallery to server in android将图像从画廊上传到android中的服务器
【发布时间】:2017-07-17 20:35:40
【问题描述】:

我正在创建一个安卓应用。我需要实现一个代码,用于从图库或通过从相机捕获上传个人资料图片。单击要上传图片的部分将显示警报。它包括三个选项一个从相机捕捉,一个从画廊拍摄,一个取消。我可以成功 当我尝试从图库上传图像时,从相机购买中捕获的图像出现此错误

E/MainActivity:来自服务器的响应:java.io.FileNotFoundException:/storage/emulated/0/Pictures/Upload/IMG_20170227_142713.jpg(没有这样的文件或目录)

这是我用来提醒生成器显示选项以及打开图片库或启动相机的代码

//code to choose profile pic
    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            /*Toast.makeText(getApplicationContext(),
                    "Please choose a photo", Toast.LENGTH_LONG)
                    .show();*/
            final CharSequence[] items = { "Take Photo", "Choose from Library",
                    "Cancel" };

            AlertDialog.Builder builder = new AlertDialog.Builder(LeftMenusMediaActivity.this);
            builder.setTitle("Add Photo!");
            builder.setItems(items,new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {


                    if (items[item].equals("Take Photo")) {

                        //define the file-name to save photo taken by Camera activity
                        String fileName = "new-photo-name.jpg";
                        //create parameters for Intent with filename
                        ContentValues values = new ContentValues();
                        values.put(MediaStore.Images.Media.TITLE, fileName);
                        values.put(MediaStore.Images.Media.DESCRIPTION,"Image captured by camera");
                        //imageUri is the current activity attribute, define and save it for later usage (also in onSaveInstanceState)
                        imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                        //create new Intent
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        imageUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

                        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

                        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                        startActivityForResult(intent, PICK_Camera_IMAGE);




                    } else if (items[item].equals("Choose from Library")) {


                        try {
                            Intent gintent = new Intent();
                            gintent.setType("image/*");
                            gintent.setAction(Intent.ACTION_GET_CONTENT);

                            startActivityForResult(
                                    Intent.createChooser(gintent, "Select Picture"),
                                    PICK_IMAGE);
                        } catch (Exception e) {
                            Toast.makeText(getApplicationContext(),
                                    e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                            Log.e(e.getClass().getName(), e.getMessage(), e);
                        }



                    } else if (items[item].equals("Cancel")) {
                        dialog.dismiss();
                    }
                }
            });
            builder.show();
        }
    });

这是我的onActivity结果函数

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     selectedImageUri = null;
    String filePath = null;
    switch (requestCode) {
        case PICK_IMAGE:
            if (resultCode == Activity.RESULT_OK) {
                selectedImageUri = data.getData();
                // getPath(selectedImageUri);
                launchUploadActivity(true);
                Toast.makeText(this, selectedImageUri.toString(), Toast.LENGTH_SHORT).show();
            }
            break;
        case PICK_Camera_IMAGE:
            if (resultCode == RESULT_OK) {
                //use imageUri here to access the image
                selectedImageUri = imageUri;
                launchUploadActivity(true);
                    /*Bitmap mPic = (Bitmap) data.getExtras().get("data");
                    selectedImageUri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), mPic, getResources().getString(R.string.app_name), Long.toString(System.currentTimeMillis())));*/
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show();
            }
            break;
    }

这是我启动上传活动的功能

 private void launchUploadActivity(boolean isImage){
    Intent i = new Intent(LeftMenusMediaActivity.this, UploadActivity.class);
    i.putExtra("filePath", selectedImageUri.getPath());
    i.putExtra("isImage", isImage);
    startActivity(i);
}

这是我的上传活动类

public class UploadActivity extends Activity {
// LogCat tag
private static final String TAG = MainActivity.class.getSimpleName();


private String filePath = null;

long totalSize = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Changing action bar background color
 /*     getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor(getResources().getString(
                    R.color.action_bar))));*/

    // Receiving the data from previous activity
    Intent i = getIntent();

    // image or video path that is captured in previous activity
    filePath = i.getStringExtra("filePath");

    // boolean flag to identify the media type, image or video
    boolean isImage = i.getBooleanExtra("isImage", true);

    if (filePath != null) {
        // Displaying the image or video on the screen
        //previewMedia(isImage);
        new UploadFileToServer().execute();
    } else {
        Toast.makeText(getApplicationContext(),
                "Sorry, file path is missing!", Toast.LENGTH_LONG).show();
    }



}

/**
 * Uploading the file to server
 * */
private class UploadFileToServer extends AsyncTask<Void, Integer, String> {
    @Override
    protected void onPreExecute() {
        // setting progress bar to zero
    //  progressBar.setProgress(0);
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... params) {
        return uploadFile();
    }

    @SuppressWarnings("deprecation")
    private String uploadFile() {
        String responseString = null;

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(AppConfig.URL_PHOTO);

        try {
            AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
                    new AndroidMultiPartEntity.ProgressListener() {


                        @Override
                        public void transferred(long num) {
                            publishProgress((int) ((num / (float) totalSize) * 100));
                        }
                    });


            File sourceFile = new File(filePath);
            ;
            // Adding file data to http body
            entity.addPart("image", new FileBody(sourceFile));

            // Extra parameters if you want to pass to server
            entity.addPart("website",
                    new StringBody("www.androidhive.info"));
            entity.addPart("email", new StringBody("abc@gmail.com"));

            totalSize = entity.getContentLength();
            httppost.setEntity(entity);

            // Making server call

            HttpResponse response = httpclient.execute(httppost);

            HttpEntity r_entity = response.getEntity();

            int statusCode = response.getStatusLine().getStatusCode();

            if (statusCode == 200) {
                // Server response

                responseString = EntityUtils.toString(r_entity);

            } else {
                responseString = "Error occurred! Http Status Code: "
                        + statusCode;
            }

        } catch (ClientProtocolException e) {
            responseString = e.toString();
        } catch (IOException e) {
            responseString = e.toString();
        }

        return responseString;

    }

    @Override
    protected void onPostExecute(String result) {
        Log.e(TAG, "Response from server: " + result);

        // showing the server response in an alert dialog
        showAlert(result);

        super.onPostExecute(result);

    }

}

/**
 * Method to show alert dialog
 * */
private void showAlert(String message) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(message).setTitle("Response from Servers")
            .setCancelable(false)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // do nothing
                }
            });
    AlertDialog alert = builder.create();
    alert.show();
}

}

从图库上传需要进行哪些更改

【问题讨论】:

  • 请参考此链接,这将有助于stackoverflow.com/questions/28000218/…
  • 也许您应该尝试上传位图而不是传递文件路径,因为 Web 服务期望一个文件并且您正在提供一个字符串
  • Response from server: java.io.FileNotFoundException: /storage/emulated/0/Pictures/Upload/IMG_20170227_142713.jpg (No such file or directory)。这是来自服务器的非常奇怪的响应!第一:为什么服务器要知道 Android 设备上文件的路径?第二:哪个服务器会尝试打开 Android 设备上的文件?
  • 如果您在上传从图库中挑选的文件时遇到问题,那么您应该只发布该代码。现在你用各种其他的东西来打扰我们。您应该只显示相关代码。您发布了太多不相关的代码,这使得深入研究您的问题变得不愉快。
  • 这里的图片库和相机都使用相同的函数上传到服务器。我只指定了在函数内的相机或画廊之间进行选择的选项。我没有指定任何不相关的代码

标签: android image file-upload upload


【解决方案1】:

我的应用程序现在正在运行。我对代码进行了以下更改。

关于活动结果部分

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     selectedImageUri = null;

    switch (requestCode) {
        case PICK_IMAGE:
            if (resultCode == Activity.RESULT_OK) {
                selectedImageUri = data.getData();
                imagepath = getPath(selectedImageUri);


                launchUploadActivity2(true);
                Bitmap bitmap=BitmapFactory.decodeFile(imagepath);
                iv.setImageBitmap(bitmap);


                Toast.makeText(this, selectedImageUri.toString(), Toast.LENGTH_SHORT).show();
            }
            break;
        case PICK_Camera_IMAGE:
            if (resultCode == RESULT_OK) {
                //use imageUri here to access the image
                selectedImageUri = imageUri;
                imagepath2=selectedImageUri.getPath();
                launchUploadActivity(true);
                Bitmap bitmap=BitmapFactory.decodeFile(imagepath2);
                iv.setImageBitmap(bitmap);
                Log.d(TAG,selectedImageUri.toString());
                Toast.makeText(this, selectedImageUri.toString(), Toast.LENGTH_SHORT).show();

            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT).show();
            }
            break;
    }

我为启动上传活动制作了两个单独的函数。 启动上传活动类以将图像从图库上传到服务器的功能是这个

    private void launchUploadActivity2(boolean isImage){

    filePath=imagepath;
    if (filePath != null) {
        // Displaying the image or video on the screen
        //previewMedia(isImage);
        new UploadImageToServer1().execute();
    } else {
        Toast.makeText(getApplicationContext(),
                "Sorry, file path is missing!", Toast.LENGTH_LONG).show();
    }
}

上传Activity类的函数,用于通过捕获上传图片到服务器

    private void launchUploadActivity(boolean isImage){

    filePath=selectedImageUri.getPath();
    if (filePath != null) {
        // Displaying the image or video on the screen
        //previewMedia(isImage);
        new UploadImageToServer().execute();
    } else {
        Toast.makeText(getApplicationContext(),
                "Sorry, file path is missing!", Toast.LENGTH_LONG).show();
    }
}

上传活动类

private class UploadImageToServer extends AsyncTask<Void, Integer, String> {
    @Override
    protected void onPreExecute() {
        // setting progress bar to zero
        //  progressBar.setProgress(0);
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... params) {
        return uploadFile();
    }

    @SuppressWarnings("deprecation")
    private String uploadFile() {
        String responseString = null;

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(AppConfig.URL_PHOTO);

        try {
            AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
                    new AndroidMultiPartEntity.ProgressListener() {


                        @Override
                        public void transferred(long num) {
                            publishProgress((int) ((num / (float) totalSize) * 100));
                        }
                    });


            File sourceFile = new File(filePath);
            ;
            // Adding file data to http body
            entity.addPart("image", new FileBody(sourceFile));

            // Extra parameters if you want to pass to server
            entity.addPart("userid",
                    new StringBody(session.getuid()));


            totalSize = entity.getContentLength();
            httppost.setEntity(entity);

            // Making server call

            HttpResponse response = httpclient.execute(httppost);

            HttpEntity r_entity = response.getEntity();

            int statusCode = response.getStatusLine().getStatusCode();

            if (statusCode == 200) {
                // Server response

                responseString = EntityUtils.toString(r_entity);

            } else {
                responseString = "Error occurred! Http Status Code: "
                        + statusCode;
            }

        } catch (ClientProtocolException e) {
            responseString = e.toString();
        } catch (IOException e) {
            responseString = e.toString();
        }

        return responseString;

    }

    @Override
    protected void onPostExecute(String result) {
        Log.e(TAG, "Response from server: " + result);

        // showing the server response in an alert dialog


        super.onPostExecute(result);

    }




}

这是在捕获图像时创建特定文件夹路径的功能

/**
 * Creating file uri to store image/video
 */
public Uri getOutputMediaFileUri(int type) {
    return Uri.fromFile(getOutputMediaFile(type));
}

/**
 * returning image / video
 */
private static File getOutputMediaFile(int type) {

    // External sdcard location
    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            AppConfig.IMAGE_DIRECTORY_NAME);

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d(TAG, "Oops! Failed create "
                    + AppConfig.IMAGE_DIRECTORY_NAME + " directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_" + timeStamp + ".jpg");
    } else if (type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "VID_" + timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

现在我可以从图库和相机上传

【讨论】:

    【解决方案2】:

    请检查清单中的权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    希望这会有所帮助。:)

    【讨论】:

    • 我已经将它包含在我的 android 清单文件中。这不是问题
    • 您提供的链接用于通过从相机捕获上传图像。这对我来说很好。我需要代码将图片从图库上传到服务器
    • 这是一个奇怪的问题。上传不应该有任何区别。如果有区别,你应该指出哪一个。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      OkHttpClient 客户端 = 新 OkHttpClient();

              RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
                      .addFormDataPart("SessionId", "")
                      .addFormDataPart("UserDeviceGuid", "")
                      .addFormDataPart("UserPhoto", "photo.png", RequestBody.create(MEDIA_TYPE_PNG, new File(path)))
                      .build();
      
              serverURL = serverURL + "/FileUpload/UserPhotoUpload";
              Request request = new Request.Builder().url(serverURL).post(requestBody).build();
              try {
                  Response response = client.newCall(request).execute();
                  String strResponse = response.body().string();
                  Log.d("upload image", "Response" + strResponse);
                  if (!response.isSuccessful()) {
                  } else {
                      JSONObject jsonResponse = null;
                      try {
                          jsonResponse = new JSONObject(strResponse);
                      } catch (JSONException e) {
                          e.printStackTrace();
                      }
                      if (jsonResponse != null && jsonResponse.has("Success") && jsonResponse.getBoolean("Success")) {
                          isSuccess = true;
                      }
                  }
              } catch (IOException e) {
                  e.printStackTrace();
      
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
      1. 获取改造对象 如果(改造==空){ 改造=新改造2.改造.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) 。建造(); } 返回改装;

      2. 界面 @GET("/照片") 调用 getAllPhotos();

      3. 获取图片路径 私有上下文上下文;

        /* 获取uri相关内容真实本地文件路径。 */ public String getUriRealPath(Context ctx, Uri uri, int type) { this.context = ctx;

         String ret = "";
        
         if (isAboveKitKat()) {
             // Android OS above sdk version 19.
             ret = getUriRealPathAboveKitkat(ctx, uri, type);
         } else {
             // Android OS below sdk version 19
             ret = getImageRealPath(context.getContentResolver(), uri, null);
         }
        
         return ret;
        

        }

        public Uri getImageUri(Context context, Bitmap bitmap) { 尝试 { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 字符串路径 = MediaStore.Images.Media.insertImage(context.getContentResolver(), 位图, "img", null); 返回 Uri.parse(路径); } 捕捉(IllegalArgumentException e){ } 捕捉(异常 e){ } 返回空值; }

        @TargetApi(Build.VERSION_CODES.KITKAT) 私有字符串 getUriRealPathAboveKitkat(上下文 ctx,Uri uri,int 类型){ 字符串 ret = "";

         if (ctx != null && uri != null) {
             if (type == 1) {
                 if (isFileUri(uri)) {
                     ret = uri.getPath();
        
                 } else if (isDocumentUri(ctx, uri)) {
                     ret = getPath(uri);
                 } else if (isGooglePhotoDoc(uri.getAuthority())) {
                     ret = uri.getLastPathSegment();
        
                 } else if (uri.toString().startsWith("content://com.google.android.apps.photos.contentprovider")){
                     try {
                         InputStream inputStream = context.getContentResolver().openInputStream(uri); // context needed
                         File photoFile = createTemporalFileFrom(inputStream);
                         ret = photoFile.getPath();
                     } catch (FileNotFoundException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 }
             } else if (isContentUri(uri)) {
                 if (isGooglePhotoDoc(uri.getAuthority())) {
                     ret = uri.getLastPathSegment();
        
                 } else if (uri.toString().startsWith("content://com.google.android.apps.photos.contentprovider")){
                     try {
                         InputStream inputStream = context.getContentResolver().openInputStream(uri); // context needed
                         File photoFile = createTemporalFileFrom(inputStream);
                         ret = photoFile.getPath();
                     } catch (FileNotFoundException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 } else if (uri.toString().startsWith("content://com.google.android.apps.photos.content")){
                     try {
                         InputStream is = context.getContentResolver().openInputStream(uri);
                         if (is != null) {
                             Bitmap pictureBitmap = BitmapFactory.decodeStream(is);
                             ret = getImageUri(context, pictureBitmap).toString();
                         }
                     } catch (FileNotFoundException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     }
                 } else {
                     ret = getImageRealPath(context.getContentResolver(), uri, null);
                 }
             } else if (isFileUri(uri)) {
                 ret = uri.getPath();
        
             } else if (isDocumentUri(ctx, uri)) {
                 ret = getPath(uri);
             }
         }
        
         return ret;
        

        }

        私有文件 createTemporalFileFrom(InputStream inputStream) 抛出 IOException { 文件 targetFile = null;

         if (inputStream != null) {
             int read;
             byte[] buffer = new byte[8 * 1024];
        
             targetFile = createTemporalFile();
             OutputStream outputStream = new FileOutputStream(targetFile);
        
             while ((read = inputStream.read(buffer)) != -1) {
                 outputStream.write(buffer, 0, read);
             }
             outputStream.flush();
        
             try {
                 outputStream.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
        
         return targetFile;
        

        }

        私有文件 createTemporalFile() { 返回新文件(context.getExternalCacheDir(),“tempFile.jpg”); // 需要上下文 }

        @RequiresApi(api = Build.VERSION_CODES.KITKAT) 私人字符串getPath(Uri uri){ 字符串 ret = "";

         // Get uri related document id.
         String documentId = DocumentsContract.getDocumentId(uri);
        
         // Get uri authority.
         String uriAuthority = uri.getAuthority();
        
         if (isMediaDoc(uriAuthority)) {
             String idArr[] = documentId.split(":");
             if (idArr.length == 2) {
                 // First item is document type.
                 String docType = idArr[0];
        
                 // Second item is document real id.
                 String realDocId = idArr[1];
        
                 // Get content uri by document type.
                 Uri mediaContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                 if ("image".equals(docType)) {
                     mediaContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                 } else if ("video".equals(docType)) {
                     mediaContentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                 } else if ("audio".equals(docType)) {
                     mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                 }
        
                 // Get where clause with real document id.
                 String whereClause = MediaStore.Images.Media._ID + " = " + realDocId;
        
                 ret = getImageRealPath(context.getContentResolver(), mediaContentUri, whereClause);
             }
        
         } else if (isDownloadDoc(uriAuthority)) {
             // Build download uri.
             Uri downloadUri = Uri.parse("content://downloads/public_downloads");
        
             // Append download document id at uri end.
             Uri downloadUriAppendId = ContentUris.withAppendedId(downloadUri, Long.valueOf(documentId));
        
             ret = getImageRealPath(context.getContentResolver(), downloadUriAppendId, null);
        
         } else if (isExternalStoreDoc(uriAuthority)) {
             String idArr[] = documentId.split(":");
             if (idArr.length == 2) {
                 String type = idArr[0];
                 String realDocId = idArr[1];
        
                 if ("primary".equalsIgnoreCase(type)) {
                     ret = Environment.getExternalStorageDirectory() + "/" + realDocId;
                 }
             }
         }
         return ret;
        

        }

        /* 检查当前的android os 版本是否大于kitkat。 */ 私人布尔 isAboveKitKat() { boolean ret = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 返回 ret; }

        /* 检查这个 uri 是否代表一个文档。 */ @TargetApi(Build.VERSION_CODES.KITKAT) 私有布尔isDocumentUri(上下文ctx,Uri uri){ 布尔 ret = 假; if (ctx != null && uri != null) { ret = DocumentsContract.isDocumentUri(ctx, uri); } 返回 ret; }

        /* 检查这个uri是否是内容uri。

        • content uri 像 content://media/external/images/media/1302716
        • */ 公共布尔isContentUri(Uri uri){ 布尔 ret = 假; 如果(uri!= null){ 字符串 uriSchema = uri.getScheme(); 如果(“内容”.equalsIgnoreCase(uriSchema)){ ret = 真; } } 返回 ret; }

        /* 判断这个uri是否是文件uri。

        • 文件 uri 像 file:///storage/41B7-12F1/DCIM/Camera/IMG_20180211_095139.jpg
        • */ 公共布尔isFileUri(Uri uri){ 布尔 ret = 假; 如果(uri!= null){ 字符串 uriSchema = uri.getScheme(); 如果(“文件”.equalsIgnoreCase(uriSchema)){ ret = 真; } } 返回 ret; }

        /* 检查此文档是否由 ExternalStorageProvider 提供。 */ 私有布尔 isExternalStoreDoc(字符串 uriAuthority){ boolean ret = false;

         if ("com.android.externalstorage.documents".equals(uriAuthority)) {
             ret = true;
         }
        
         return ret;
        

        }

        /* 检查此文档是否由 DownloadsProvider 提供。 */ 私有布尔 isDownloadDoc(字符串 uriAuthority){ boolean ret = false;

         if ("com.android.providers.downloads.documents".equals(uriAuthority)) {
             ret = true;
         }
        
         return ret;
        

        }

        /* 检查此文档是否由 MediaProvider 提供。 */ 私有布尔 isMediaDoc(字符串 uriAuthority){ boolean ret = false;

         if ("com.android.providers.media.documents".equals(uriAuthority)) {
             ret = true;
         }
        
         return ret;
        

        }

        /* 检查此文档是否由 google photos 提供。 */ 私人布尔 isGooglePhotoDoc(字符串 uriAuthority){ boolean ret = false;

         if ("com.google.android.apps.photos.content".equals(uriAuthority)) {
             ret = true;
         }
        
         return ret;
        

        }

        /* 返回uri表示的文档文件真实本地路径*/ public String getImageRealPath(ContentResolver contentResolver, Uri uri, String whereClause) { 字符串 ret = "";

         // Query the uri with condition.
         Cursor cursor = contentResolver.query(uri, null, whereClause, null, null);
        
         if (cursor != null) {
             boolean moveToFirst = cursor.moveToFirst();
             if (moveToFirst) {
        
                 // Get columns name by uri type.
                 String columnName = MediaStore.Images.Media.DATA;
        
                 if (uri == MediaStore.Images.Media.EXTERNAL_CONTENT_URI) {
                     columnName = MediaStore.Images.Media.DATA;
                 } else if (uri == MediaStore.Audio.Media.EXTERNAL_CONTENT_URI) {
                     columnName = MediaStore.Audio.Media.DATA;
                 } else if (uri == MediaStore.Video.Media.EXTERNAL_CONTENT_URI) {
                     columnName = MediaStore.Video.Media.DATA;
                 }
        
                 // Get column index.
                 int imageColumnIndex = cursor.getColumnIndex(columnName);
        
                 // Get column value which is the uri related file local path.
                 ret = cursor.getString(imageColumnIndex);
             }
         }
        
         if (cursor != null){
             cursor.close();
         }
        
         return ret;
        

        }

      【讨论】:

        【解决方案5】:

        以下代码从图库中获取图片并显示在图片视图中

        @覆盖 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); 开关(请求代码){ 案例 1111: if (resultCode == Activity.RESULT_OK) { 如果(数据!= null){ Uri selectedImage = data.getData(); if (selectedImage == null) { 位图bitmap = (Bitmap) data.getExtras().get("data");

                                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        
                                String name = "" + System.currentTimeMillis();
                                String path = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, name, null);
                                selectedImage = Uri.parse(path);
                            }
                            if (selectedImage != null) {
                                adapter.dataList.get(index).setUri(selectedImage);
                                adapter.notifyDataSetChanged();
                                gotoUploadImage(selectedImage);
                            }
                        }
                    }
                    break;
            }
        }
        

        【讨论】:

          【解决方案6】:

          以下代码是从网络服务器获取列表

          GetDataService 服务 = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);

              Call<List<RetroPhoto>> call = service.getAllPhotos();
              call.enqueue(new Callback<List<RetroPhoto>>() {
          
                  @Override
                  public void onResponse(Call<List<RetroPhoto>> call, Response<List<RetroPhoto>> response) {
                      progressDoalog.dismiss();
                      generateDataList(response.body());
                  }
          
                  @Override
                  public void onFailure(Call<List<RetroPhoto>> call, Throwable t) {
                      progressDoalog.dismiss();
                      Toast.makeText(HomeScreenActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                  }
              });
          

          【讨论】:

            猜你喜欢
            • 2011-02-02
            • 2015-03-29
            • 2011-10-15
            • 2020-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多