2015-06-21 61 views
0

我在Android中使用裁剪目的時遇到問題。位於內部存儲器中的裁剪圖像

我將圖像存儲在我的應用程序的內部存儲分配中,我希望能夠裁剪它們,然後將它們設置爲壁紙。

我可以得到它與存儲在外部存儲器中的圖像和工作中使用此代碼:

cropIntent.setDataAndType(Uri.fromFile(new File(uri)), "image/*"); 

當我執行的意圖下面的代碼無法啓動農作物意向,並返回一個0結果代碼。

Intent cropIntent = new Intent("com.android.camera.action.CROP"); 

cropIntent.setDataAndType(FileProvider.getUriForFile(activity, "com.example.test.fileprovider", new File(uri)), "image/*"); 

cropIntent.putExtra("crop", "true"); 
cropIntent.putExtra("aspectX", 9); 
cropIntent.putExtra("aspectY", 16); 
cropIntent.putExtra("return-data", true); 
cropIntent.putExtra("scale", true); 

activity.startActivityForResult(cropIntent, PIC_CROP); 

回答

3

Storage Options | Android Developers

默認情況下,保存到內部存儲文件僅對您的應用程序和其他應用程序不能訪問它們(也可以在用戶)。

ACTION_CROP啓動支持裁剪的「其他應用程序」,並將裁剪文件的URI傳遞給它。如果該文件位於內部存儲器中,則裁剪應用程序無法直接訪問該文件。

使用FileProvider向其他應用程序提供內部文件需要進行一些配置。從Setting Up File Sharing | Android Developers

指定FileProvider

定義FileProvider爲您的應用程序需要在您的清單中的條目。此條目指定用於生成內容URI的權限,以及指定您的應用可以共享的目錄的XML文件的名稱。

<剪斷>

指定可共享目錄

一旦你添加了FileProvider到您的應用清單,你需要指定包含要共享的文件的目錄。要指定目錄,首先在項目的res/xml /子目錄中創建文件filepaths.xml。

以下FileProvider樣品集成代碼併成功打開作物活性內部存儲的圖像(在Nexus 5測試,股票的Android 5.1.1)上:

的AndroidManifest.xml

<application 
     ...> 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.example.test.fileprovider" 
      android:grantUriPermissions="true" 
      android:exported="false"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/filepaths" /> 
     </provider> 
     ... 
    </application> 

RES/XML/filepaths.xml

<paths> 
    <files-path path="images/" name="images" /> 
</paths> 

MainActivity。java

  // Manually stored image for testing 
      final File imagePath = new File(getFilesDir(), "images"); 
      final File imageFile = new File(imagePath, "sample.jpg"); 

      // Provider authority string must match the one declared in AndroidManifest.xml 
      final Uri providedUri = FileProvider.getUriForFile(
        MainActivity.this, "com.example.test.fileprovider", imageFile); 

      Intent cropIntent = new Intent("com.android.camera.action.CROP"); 

      cropIntent.setDataAndType(providedUri, "image/*"); 

      cropIntent.putExtra("crop", "true"); 
      cropIntent.putExtra("aspectX", 9); 
      cropIntent.putExtra("aspectY", 16); 
      cropIntent.putExtra("return-data", true); 
      cropIntent.putExtra("scale", true); 

      // Exception will be thrown if read permission isn't granted 
      cropIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      startActivityForResult(cropIntent, PIC_CROP); 
+0

我原以爲實現一個「FileProvider」可以解決這個問題。有沒有解決這個問題的方法? – MachineDude

+1

對不起,我發佈時的回答不完整,昨天我無法回覆。剛剛更新。 – unrulygnu

+0

它的工作原理!非常感謝你的幫助! :) – MachineDude