2017-11-17 10 views
0

ich zwei App haben, von einer anderen App ich alle Bilder zu bekommen, nehme an, es StickerProvider und MainActivity andere App istInhalt kann nicht geöffnet werden: Custom Content Provider

StickerProvider Contentprovider, hat MainActivity ContentResolver

StickerProvider App hat Asset-Ordner

Vermögens ----> Aufkleber ----------> a.png, B.png

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; 
    } 

} 

Es ist menifest Datei ist

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

Eine andere App MainActivity ist ------> Daraus ich alle Bilder von oben apps

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(); 
     } 
    } 
} 

holen wollen Wann immer ich anfange MainActivity App I bekomme unter Ausnahme

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) 

Antwort

0

ic_launcher ist mit App-Symbol verbunden. Es gibt kein App-Symbol. Überprüfen Sie Ihr Symbol in Ihrem Zeichenverzeichnis.

+0

Sorry für einfach zu verstehen Ich habe a.png und b.png geschrieben aber real gab es ic_launcher.png aber rechts n ow ich habe bearbeitet –

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

Ihr ContentProvider unterstützt dies nicht. Es implementiert openFile() oder eine seiner Varianten nicht.

Entweder:

  • eine bestehende ContentProvider verwenden, die Unterstützung für die Bedienung Vermögen bietet, wie my StreamProvider oder

  • Ihrem Provider Augment openFile(), zu unterstützen, wie ich in this sample app tun

+0

Vielen Dank für Ihren Vorschlag, aber ich möchte alle Bilder (Vermögenswerte Ordner) anzeigen, die in ContentProvider App sind, kann ich nicht Pfad und alles anzeigen, so dass es leicht für mich zu handhaben wäre Bitmap –

+0

@SiddhpuraAmit: Assets sind Dateien auf Ihrem Entwicklungscomputer. Sie sind keine Dateien auf dem Gerät. Der Sinn hinter einem 'ContentProvider' liegt darin, Inhalte * in anderen Apps * zu veröffentlichen. Wenn Sie diese Assets nur in Ihrer eigenen App verwenden möchten, entfernen Sie den 'ContentProvider'. Verwenden Sie dann 'AssetManager' und seine' open() 'Methode, um einen' InputStream' auf dem Asset zu erhalten, und verwenden Sie 'BitmapFactory.decodeStream()', um Ihre 'Bitmap' zu erstellen. – CommonsWare

Verwandte Themen