2017-11-17 13 views
0

콘텐츠를 열 수 없습니다 : 사용자 정의 컨텐츠 제공자 내가, 내가 모든 이미지를 얻으려면 다른 응용 프로그램에서, 이 StickerProvider 및 MainActivity 다른 응용 프로그램이 두 개의 응용 프로그램을 가정 한

는 StickerProvider가 컨텐트 프로입니다, MainActivity는

컨텐트 리졸버있다 StickerProvider 앱은

public class StickerProvider extends ContentProvider { 

    private final static String LOG_TAG = StickerProvider.class.getName(); 

    private static final String[] COLUMNS = { 
      OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}; 

    @Override 
    public boolean onCreate() { 
     return true; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     /** 
     * Source: {@link FileProvider#query(Uri, String[], String, String[], String)} . 
     */ 
     if (projection == null) { 
      projection = COLUMNS; 
     } 

     String[] images = new String[0]; 
     try { 
      images = getContext().getAssets().list("stickers"); 

      ArrayList<String> listImages = new ArrayList<String>(Arrays.asList(images)); 

      final MatrixCursor cursor = new MatrixCursor(new String[]{"path"}, 1); 
      for (int i = 0; i < listImages.size(); i++) { 
       cursor.addRow(new String[]{listImages.get(i)}); 
      } 

      return cursor; 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    public String getType(Uri uri) { 
     /** 
     * Source: {@link FileProvider#getType(Uri)} . 
     */ 
     final String file_name = uri.getLastPathSegment(); 
     final int lastDot = file_name.lastIndexOf('.'); 
     if (lastDot >= 0) { 
      final String extension = file_name.substring(lastDot + 1); 
      final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
      if (mime != null) { 
       return mime; 
      } 
     } 

     return "image/png"; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     return null; 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     return 0; 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
     return 0; 
    } 

} 
을 b.png, 자산 폴더

자산 ----> 스티커 ----------> a.png있다

그건 menifest 파일이 다른 응용 프로그램은 MainActivity입니다

<provider 
      android:name="com.example.StickerProvider" 
      android:authorities="com.example" 
      android:exported="true" 
      android:grantUriPermissions="true" 
      android:label="StickerProvider" /> 

------> 내가 위에서 응용

public class MainActivity extends AppCompatActivity { 

    int i=0; 
    private static final String TAG = "MainActivity"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ImageView ivOne = (ImageView)findViewById(R.id.ivOne); 
     ImageView ivTwo = (ImageView)findViewById(R.id.ivTwo); 

     try { 
      ContentResolver resolver = getContentResolver(); 

      Cursor cursor = 
        resolver.query(Uri.parse("content://com.example/stickers"), 
          null, 
          null, 
          null, 
          null); 
      if (cursor.moveToFirst()) { 
       do { 
        String word = cursor.getString(0); 
        if(i==0){ 
         ivOne.setImageURI(Uri.parse("content://com.example/stickers/"+word)); 
        }else if(i==1){ 
         ivTwo.setImageURI(Uri.parse("content://com.example/stickers/"+word)); 
        } 
        // do something meaningful 
        Log.d(TAG, "onCreate: "+word); 
       } while (cursor.moveToNext()); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

을의 모든 이미지를 가져 오기 할이에서 나는 시작 이제까지 MainActivity 앱 I입니다 예외보다 아래에 있습니다

Unable to open content: content://com.example/a.png 
      java.io.FileNotFoundException: No files supported by provider at content://com.example/a.png 
       at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:144) 
       at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:692) 
       at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1149) 
       at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:986) 
       at android.content.ContentResolver.openInputStream(ContentResolver.java:706) 
       at android.widget.ImageView.getDrawableFromUri(ImageView.java:900) 
       at android.widget.ImageView.resolveUri(ImageView.java:871) 
       at android.widget.ImageView.setImageURI(ImageView.java:490) 
       at android.support.v7.widget.AppCompatImageView.setImageURI(AppCompatImageView.java:124) 
       at com.pixr.photo.collage.MainActivity.onCreate(MainActivity.java:36) 
       at android.app.Activity.performCreate(Activity.java:6684) 
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2652) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2766) 
       at android.app.ActivityThread.-wrap12(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:154) 
       at android.app.ActivityThread.main(ActivityThread.java:6236) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781) 

답변

0

ic_launcher는 앱 아이콘과 관련됩니다. 앱 아이콘이 없습니다. drawable 디렉토리에서 아이콘을 확인하십시오.

+0

죄송합니다. 쉽게 이해할 수 있도록 a.png와 b.png를 작성했지만 실제는 ic_launcher.png이지만 오른쪽 n 아우 편집했습니다 –

0
ivOne.setImageURI(Uri.parse("content://com.example/stickers/"+word)); 

ContentProvider은이 기능을 지원하지 않습니다. openFile() 또는 그 변형을 구현하지 않습니다.

다음 중 하나를

  • this sample app

  • 에 내가 같은 openFile()을 지원하기 위해 기능 보강 역할을 자산에 대한 지원을 제공 ContentProvider 같은 my StreamProvider, 또는
  • 기존 공급자를 사용하여
+0

제안 해 주셔서 대단히 감사합니다.하지만 ContentProvider 앱에있는 모든 이미지 (에셋 폴더)를 표시하고 싶습니다. 경로를 가져와 표시 할 수 없으므로 처리하기가 쉽습니다. 비트 맵 –

+0

@SiddhpuraAmit : 애셋은 개발 컴퓨터의 파일입니다. 장치의 파일이 아닙니다. 'ContentProvider'를 갖는 것의 요지는 다른 응용 프로그램에 내용 *을 게시하는 것입니다. 자신의 앱에서만 이러한 애셋을 사용하려면 'ContentProvider'를 제거하십시오. 그런 다음 AssetManager와 그것의 open() 메소드를 사용하여 자산에 대한 InputStream을 얻고,'BitmapFactory.decodeStream()'을 사용하여'Bitmap'을 생성하십시오. – CommonsWare

관련 문제