2017-06-30 52 views
0

我創建了一個用於從圖庫或照相機中選取任何圖像的意圖選擇器。它在模擬器和其他設備上工作正常,但是當我使用redmi note 4測試它時,它顯示「沒有應用程序可以執行此操作」。意圖選擇器從圖庫或照相機中選取圖像不在某些設備上工作

代碼是在這裏 -

try { 
     f = createImageFile(); 
     outputFileUri = Uri.fromFile(f); 
     grantUriPermission("com.android.camera", outputFileUri, 
       Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     List<Intent> allIntents = new ArrayList<>(); 
     if (outputFileUri != null) { 
      Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      List<ResolveInfo> listCam = getPackageManager().queryIntentActivities(captureIntent, 0); 
      for (ResolveInfo res : listCam) { 
       Intent intent = new Intent(captureIntent); 
       intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
       intent.setPackage(res.activityInfo.packageName); 
       if (outputFileUri != null) 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
       allIntents.add(intent); 
      } 
     } 
     allIntents.addAll(getGalleryIntents(getPackageManager(), false)); 
     Intent target; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
      target = new Intent(); 
     else { 
      target = allIntents.get(allIntents.size() - 1); 
      allIntents.remove(allIntents.size() - 1); 
     } 
     Intent chooserIntent = Intent.createChooser(target, "Select Source"); 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, allIntents.toArray(new Parcelable[allIntents.size()])); 
     startActivityForResult(chooserIntent, REQ_PICK_IMAGE); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     f = null; 
     outputFileUri = null; 
    } 


    public static List<Intent> getGalleryIntents(@NonNull PackageManager packageManager, boolean includeDocuments) { 
    List<Intent> intents = new ArrayList<>(); 
    Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    galleryIntent.setType("image/*"); 
    List<ResolveInfo> listGallery = packageManager.queryIntentActivities(galleryIntent, 0); 
    for (ResolveInfo res : listGallery) { 
     Intent intent = new Intent(galleryIntent); 
     intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
     intent.setPackage(res.activityInfo.packageName); 
     intents.add(intent); 
    } 
    if (!includeDocuments) { 
     for (Intent intent : intents) { 
      if (intent.getComponent().getClassName().equals("com.android.documentsui.DocumentsActivity")) { 
       intents.remove(intent); 
       break; 
      } 
     } 
    } 
    return intents; 
} 

private File createImageFile() throws IOException { 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; 
    File albumF = getAlbumDir(); 
    File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF); 
    return imageF; 
} 

abstract class AlbumStorageDirFactory { 
    public abstract File getAlbumStorageDir(String albumName); 
} 

public final class BaseAlbumDirFactory extends AlbumStorageDirFactory { 
    // Standard storage location for digital camera files 
    private static final String CAMERA_DIR = "/dcim/"; 

    @Override 
    public File getAlbumStorageDir(String albumName) { 
     return new File(Environment.getExternalStorageDirectory() + CAMERA_DIR + albumName); 
    } 
} 

public final class FroyoAlbumDirFactory extends AlbumStorageDirFactory { 
    @Override 
    public File getAlbumStorageDir(String albumName) { 
     return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName); 
    } 
} 

private File getAlbumDir() { 
    File storageDir = null; 
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 
     storageDir = mAlbumStorageDirFactory.getAlbumStorageDir(getAlbumName()); 
     if (storageDir != null) 
      if (!storageDir.mkdirs()) 
       if (!storageDir.exists()) { 
        Log.d("CameraSample", "failed to create directory"); 
        return null; 
       } 
    } else Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE."); 
    return storageDir; 
} 

請幫幫忙! 我錯過了什麼嗎?

+1

你可以發佈getGalleryIntents函數的代碼? –

+0

當然,請等待 – Sar

+0

現在它的可用 – Sar

回答

0

我面臨同樣的問題,但後來我意識到這是存儲權限問題。我通過添加if條件來修改我的代碼。

試試這個

image_layout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      isImageSelect =false; 
      //checking if permission is granted for write_external_storage 
      if(ActivityCompat.checkSelfPermission(NewMemberActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){ 
       selectImage(); 
      } 
      else{ 
       //Requesting Permission for write_external_storage 
       ActivityCompat.requestPermissions(NewMemberActivity.this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},1); 
      } 
     } 
    }); 
相關問題