2017-11-17 52 views
0

私は がStickerProviderとMainActivity異なるアプリがありコンテンツを開くことができません:カスタムコンテンツプロバイダ

StickerProviderはContentProviderの、MainActivityがContentResolverの

を持っていると仮定し、私はすべての画像を取得したい、他のアプリから、2つのアプリを持っています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のApp 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()またはその変形を実装していません。

次のいずれかの

  • などmy StreamProviderなどの資産を、提供するためのサポートを提供しています既存のContentProviderを使用するか、または

  • は私がthis sample app

  • で行うなど、 openFile()をサポートするために、プロバイダを強化
+0

あなたの提案にはありがとうございますが、私はContentProvider Appにあるすべての画像(資産フォルダ)を表示したい、パスを取得してそのすべてを表示することはできません。ビットマップ –

+0

@SiddhpuraAmit:アセットは開発マシンのファイルです。それらはデバイス上のファイルではありません。 'ContentProvider'を持つことの背後にあるポイントは、コンテンツ*を他のアプリに公開することです*。あなた自身のアプリケーションでこれらのアセットだけを使用したい場合は、 'ContentProvider'を取り除いてください。次に、 'AssetManager'とその' open() 'メソッドを使ってアセットに' InputStream'を取得し、 'BitmapFactory.decodeStream()'を使って 'Bitmap'を作成します。 – CommonsWare

関連する問題