2017-08-11 46 views
0

我的嘗試根本不起作用。奇怪的是,在調試時從相機中捕獲照片,但沒有進行生產。正確的方式如何從畫廊和拍攝的照片中獲取圖像?

@Override 
public void onActivityResult(int requestCode, int resultCode, final Intent data) { 
    if (!Debug.isDebuggerConnected()){ 
     Debug.waitForDebugger(); 
     Log.d("debug", "started"); // Insert a breakpoint at this line!! 
    } 

    if (resultCode != RESULT_OK) { 
     return; 
    } 

    File file = null; 
    Uri path = null; 

    Bitmap image = null; 

    switch (requestCode) { 
     case RequestCodes.REQUEST_IMAGE_CAPTURE: 
      Bundle extras = data.getExtras(); 
      image = (Bitmap) extras.get("data"); 
      file = ImageUtils.saveToFile(image, "profile_picture", this); 
      mProfileImageView.setImageBitmap(image); 
      mCurrentAbsolutePath = file.getAbsolutePath(); 
      break; 
     case RequestCodes.REQUEST_IMAGE_SELECT: 
      path = data.getData(); 
      mProfileImageView.setImageURI(path); 
      mCurrentAbsolutePath = path.getPath(); 
      file = new File(mCurrentAbsolutePath); 
      image = BitmapFactory.decodeFile(mCurrentAbsolutePath, new BitmapFactory.Options()); 
      break; 
     default: 
      break; 
    } 

    try { 
     if(RequestCodes.REQUEST_IMAGE_SELECT == requestCode){ 
      file = File.createTempFile(
        "user_picture", /* prefix */ 
        ".jpeg",   /* suffix */ 
        getExternalFilesDir(Environment.DIRECTORY_PICTURES)  /* directory */ 
      ); 
      File pathFile = new File(ImageUtils.getPath(path, this)); 
      GeneralUtils.copy(pathFile, file); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    Bitmap thumbnail = ThumbnailUtils.extractThumbnail(image, 100, 100); 
    String thumbnailPath = null; 

    // Edited source: https://stackoverflow.com/a/673014/6519101 
    FileOutputStream out = null; 
    try { 
     // PNG is a lossless format, the compression factor (100) is ignored 
     thumbnailPath = File.createTempFile(
       "user_picture_thumbnail", /* prefix */ 
       ".png",   /* suffix */ 
       getExternalFilesDir(Environment.DIRECTORY_PICTURES)  /* directory */ 
     ).getAbsolutePath(); 
     out = new FileOutputStream(thumbnailPath); 
     thumbnail.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (out != null) { 
       out.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    String finalPath = file.getPath(); 
    UserClient client = new UserClient(); 
    String finalThumbnailPath = thumbnailPath; 
    client.changeUserPicture(file, FileUtils.getMimeType(this, Uri.fromFile(file)), new ApiListener<Response<ResponseBody>>(this){ 
     @Override 
     public void onSuccess(Response<ResponseBody> response, int statusCode) { 
      SharedPreferencesManager preferences = SharedPreferencesManager.getInstance(); 
      preferences.put(SharedPreferencesManager.Key.ACCOUNT_IMAGE_PATH, finalPath); 
      preferences.put(SharedPreferencesManager.Key.ACCOUNT_IMAGE_THUMBNAIL_PATH, finalThumbnailPath); 
      super.onSuccess(response, statusCode); 
     } 
    }); 
} 

不幸的是調試時的來自實施例的路徑 「/ 0/4 /內容://媒體/外部/圖像/媒體/ 54257/ORIGINAL/NONE/1043890606」 的解碼的文件最終被無效和休息一切。

什麼是從畫廊獲取和從照片捕獲圖像的最佳方式?

回答

1

你應該使用的是內容提供商和解析器here,它可以被認爲是數據庫和訪問數據庫,以便於理解。

你在那裏的路徑稱爲URI,它基本上就像是一個數據庫條目的鏈接。相機和畫廊都積極使用內容提供商和解析器。拍攝照片時,會保存照片,但相機應用程序還會讓內容提供商知道添加了新條目。現在,每個擁有內容解析器的應用程序(如圖庫應用程序)都可以找到該照片,因爲該URI存在。

因此,如果您想訪問庫中的所有照片,則應該按照指南實施內容解析程序。另外,如果您使用代碼來複製圖像文件,但不更新內容提供程序,則除非知道絕對路徑,否則其他應用程序無法看到新複製的文件。但是,當您重新啓動手機時,某些系統會對所有圖像文件進行全面重新檢查,並且您的內容提供者可能會使用新複製的文件進行更新。因此,請嘗試在測試時重新啓動手機。

相關問題