2016-09-06 2 views
-2

사용자가 갤러리에서 사진을 선택하여 프로필 사진으로 설정해야하는 응용 프로그램을 개발 중입니다. 이제 아래 코드가 대부분의 장치에서 제대로 작동하고 있습니다 (Motorola Moto G, One plus X, MI 4i 및 기타 제품을 확인했습니다). 내가 그것을 실행할 때마다 오류를주고 주요 redmi는 다음과 같이 말했다갤러리에서 이미지를 선택하고 ImageView에 표시 하시겠습니까?

스택 트레이스

에게

프로세스 : com.example.lordvoldemort.imagepicker를, PID를 : 23,291
java.lang.RuntimeException가 : 실패 제공하는 결과를 ResultInfo {who = null, 요청 = 1, 결과 = -1, 데이터 = 의도 { dat = file : ///storage/emulated/0/DCIM/Camera/IMG_20160807_003845_HDR.jpg 일반 = 이미지/jpeg}} 활동 {com.example.lordvoldemort.imagepicker/com.example.lordvoldemort.imagepicker.MainActivity} : java.lang.NullPointerException : Att 에서 android.app.ActivityThread.deliverResults (ActivityThread.java:3595) 에서 참조 android.app.ActivityThread.handleSendResult 널 객체 ') 부울 android.database.Cursor.moveToFirst ('인터페이스 메소드를 호출 EMPT android.os.Handler에서 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1366) 에서 android.app.ActivityThread.access $ 1300 (ActivityThread.java:154) 에서 (ActivityThread.java:3638) .dispatchMessage (Handler.java:102) android.os.Looper.loop (Looper.java:135) 에 있습니다. android.app.ActivityThread.main (ActivityThread.java:5290) at java.lang.reflect.Method.invoke (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:703) 에 의해 발생 : java.lang.NullPointerException : 인터페이스 호출 시도 'null boolean android.database.Cursor.moveToFirst()'객체 참조 com.example.lordvoldemort.imagepicker.MainActivity.onActivityR android.app.ActivityThread.handleSendResult에서 android.app.ActivityThread.deliverResults에서 android.app.Activity.dispatchActivityResult (Activity.java:6241) 에서 esult (MainActivity.java:104) (ActivityThread.java:3591) android.os.Handler에서 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1366) 에서 android.app.ActivityThread.access $ 1300 (ActivityThread.java:154) 에서 (ActivityThread.java:3638) .dispatchMessage (Handler.java:102) android.os.Looper.loop (Looper.java:135) 에 있습니다. android.app.ActivityThread.main (ActivityThread.java:5290) at java.lang.reflect.Method.invoke (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:908) at com.android.internal.os.ZygoteInit.main (ZygoteInit.자바 : 703)

코드 제가

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

        Cursor cursor = getContentResolver() 
          .query(selectedImage, filePathColumn, null, 
            null, null); 
        assert cursor != null; 
        cursor.moveToFirst(); 

        int columnIndex = cursor 
          .getColumnIndex(filePathColumn[0]); 
        String filePath = cursor.getString(columnIndex); 
        cursor.close(); 

        newbitmap = BitmapFactory.decodeFile(filePath); 
        ImageView ivImage = (ImageView)findViewById(R.id.image); 
        ivImage.setImageBitmap(newbitmap); 


public String getPathFromURI(Uri contentUri) { 
     String res = null; 
     String[] proj = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null); 
     if (cursor.moveToFirst()) { 
      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      res = cursor.getString(column_index); 
     } 
     cursor.close(); 
     return res; 
    } 

오류가 ActivityResult-에 사용하고 - 널의 인터페이스 메소드를 호출 시도 '부울 android.database.Cursor.moveToFirst() 객체 참조

+0

해결책을 얻었습니까? 같은 오류 직면 –

답변

0

이제 아래 코드는 대부분의 장치에 제대로 작동

아주 소수의 장치에서만 안정적으로 작동 할 것으로 생각됩니다. Uri의 출처는 약간 다를 수 있습니다.

오류는 - MediaStoreUri가 인식되지 않기 때문이다 널 객체 참조

에 인터페이스 메소드를 호출 시도 '부울 android.database.Cursor.moveToFirst(). getPathFromURI()은 몇 가지 기기에서 몇 가지 Uri 값으로 작동합니다 (단, 다시 Uri이 오는 위치에 따라 다릅니다).

A Uri is not a file. Uri에 대한 "실제 경로"가 존재할 필요는 없습니다.이 파일의 경로는 웹 서버의 경로 /questions/39355114/select-image-from-gallery-and-show-in-an-imageview (이 질문의 URL 경로 부분)에 있어야합니다.

+0

그래서 어떻게 똑같은 장치에서 Whataspp 또는 페이스 북처럼 커다란 회사합니까 ?? 내 코드에서 뭔가 부족할 것임에 틀림 없다. –

+0

@AmanVerma : "어떻게 똑같은 장치에서 Whataspp이나 facebook 같은 큰 회사를 운영합니까?" - 가장 가능성이 높습니다 ('Uri'를 올바르게 사용함) (https://commonsware.com/blog/2016/03/15/how-consume-content-uri.html). 예를 들어 Picasso와 같은 대부분의 이미지로드 라이브러리는'Uri '로 작업하는 방법을 알고 있습니다. 귀하가 'Uri'로 식별 된 콘텐츠에 대한 귀하의 액세스 권한이 제한되어있는 경우 (https : //)와 같이 오래 사용하려는 경우 이미지 사본을 만들어야 할 수도 있습니다. commonsware.com/blog/2016/08/10/uri-access-lifetime-shorter-than-you-might-think.html). – CommonsWare

+0

Android 4.4 이상에서는 [저장 장치 액세스 프레임 워크] (https://commonsware.com/blog/2016/05/03/storage-access-framework-faq.html)를 통해'ACTION_OPEN_DOCUMENT'을 사용할 수 있습니다. 콘텐츠에 장기간 액세스하려면'takePersistableUriPermissions()'를 사용하십시오. 여전히'Uri'를 얻었고'Uri'를 이미지 로딩 라이브러리로 사용하거나 수동으로'ContentResolver'를 사용합니다. – CommonsWare

관련 문제