2017-04-27 92 views
0

我試圖從庫獲得的圖像,並顯示在ImageView的那個形象,但得到這個錯誤:如何從圖庫中獲取圖像並在ImageView中設置(擴展Fragment)?

E/ActivityManager: Sending non-protected broadcast com.motorola.motocare.INTENT_TRIGGER from system 4425:com.motorola.process.system/1000 pkg com.motorola.motgeofencesvc 
                java.lang.Throwable 
                 at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:18179) 
                 at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:18779) 
                 at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:512) 
                 at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2905) 
                 at android.os.Binder.execTransact(Binder.java:565) 
04-27 17:21:28.696 559-559/? W/SurfaceFlinger: couldn't log to binary event log: overflow. 

這裏的完整代碼如下:

main.java

package omcommunication.image; 

public class AddWOD extends Fragment implements View.OnClickListener { 
Activity activity; 

public AddWOD() { 
} 

; private static int IMG_RESULT = 1; 
String ImageDecode; 
ImageView imageViewLoad; 
Button LoadImage; 
Intent intent; 
String[] FILE; 
View view; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.activity_add_wod, container, false); 
    img=(ImageView) view.findViewById(R.id.imgview); 
    buy_image1 = (ImageView) view.findViewById(R.id.rent_iv_addpro_image1); 
    buy_image1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      intent = new Intent(Intent.ACTION_PICK, 
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

      startActivityForResult(intent, IMG_RESULT); 



     } 
    }); 
    return view; 
} 

    @Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    try { 

     if (requestCode == IMG_RESULT && resultCode == RESULT_OK 
       && null != data) { 


      Uri URI = data.getData(); 
      String[] FILE = { MediaStore.Images.Media.DATA }; 


      Cursor cursor = getActivity().getContentResolver().query(URI, 
        FILE, null, null, null); 

      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(FILE[0]); 
      ImageDecode = cursor.getString(columnIndex); 
      cursor.close(); 

      img.setImageBitmap(BitmapFactory 
        .decodeFile(ImageDecode)); 

     } 
    } catch (Exception e) { 
     Toast.makeText(getActivity(), "Please try again", Toast.LENGTH_LONG) 
       .show(); 
    } 

} 

我提到很多問題,但沒有得到所需的東西,是的,我給清單中的外部存儲權限。

+0

的關鍵詞在你的錯誤信息是'權限denied'。您是否要求從外部存儲讀取權限?你使用哪個targetSDK和Android版本? –

+1

你測試你的代碼中有一個Android版本比棒棒糖更多的設備?如果是,那麼你必須添加運行時權限。 –

+1

檢查應用程序設置,無論您的應用程序是否具有存儲權限?只需在Manifest文件中提及是不夠的。 – Sac

回答

0

您最好將Uri轉換爲an image-loading library,例如Picasso,它不僅可以處理所有圖像加載,還可以在後臺線程上處理。

如果你堅持要自己做這個東西,入手:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    try { 

     if (requestCode == IMG_RESULT && resultCode == RESULT_OK 
       && null != data) { 
      imageViewLoad.setImageBitmap(BitmapFactory 
        .decodeStream(getContentResolver().openInputStream(data.getData())); 

     } 
    } catch (Exception e) { 
     Toast.makeText(this, "Please try again", Toast.LENGTH_LONG) 
       .show(); 
    } 

} 

然後,你得到的工作,切換到使用AsyncTask或東西做在後臺線程的decodeStream()部分,做後setImageBitmap()部分在主應用程序線程上。

特別是,這不應該要求你與運行權限混亂。使用Uri適當採取您作爲用戶選擇圖片的結果臨時權限授予的優勢。

1

如果您正在運行設備超過Lollipop大,那麼你必須失去Android Runtime Permissions

您可以參考here的答案。

+0

okey是正確的,我使用片段當我運行相同的代碼,然後它不工作.. – Andie

0

代碼用於允許運行時權限

如果(Build.VERSION.SDK_INT> = 23)

{ checkMultiplePermissions();

} 私人無效checkMultiplePermissions(){

if (Build.VERSION.SDK_INT >= 23) { 
     List<String> permissionsNeeded = new ArrayList<String>(); 
     List<String> permissionsList = new ArrayList<String>(); 

     if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) { 
      permissionsNeeded.add("Access Location"); 
     } 

     if (permissionsList.size() > 0) { 
      requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
      return; 
     } 
    } 
} 

private boolean addPermission(List<String> permissionsList, String permission) { 
    if (Build.VERSION.SDK_INT >= 23) 

     if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { 
      permissionsList.add(permission); 

      // Check for Rationale Option 
      if (!shouldShowRequestPermissionRationale(permission)) 
       return false; 
     } 
    return true; 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: { 

      Map<String, Integer> perms = new HashMap<String, Integer>(); 
      perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); 


      for (int i = 0; i < permissions.length; i++) 
       perms.put(permissions[i], grantResults[i]); 
      if (perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 
       // All Permissions Granted 
       return; 
      } else { 
       // Permission Denied 
       if (Build.VERSION.SDK_INT >= 23) { 


       } 
      } 
     } 
     break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 
0

其對我來說工作:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) 
     { 
      Uri selectedImg = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
      Cursor cursor = getActivity().getContentResolver().query(selectedImg, 
        filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String picturePath = cursor.getString(columnIndex); 
      buy_image1 .setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
      cursor.close(); 
     } 
    } 
相關問題