2011-09-23 73 views
0

我正在使用以下代碼從資產文件夾設置圖像。Android setImageUri不適用於資產Uri

Uri numBgUri = Uri.parse("file:///android_asset/background_numbers.png"); 
numBgImage.setImageURI(numBgUri); 

background_numbers.png文件肯定存在於資產根目錄中。我在日誌中得到一個FileNotFoundException: -

09-23 17:05:23.803: WARN/ImageView(23713): Unable to open content: file:///android_asset/background_numbers.png 

任何想法我可能做錯了什麼?

謝謝!

回答

6

我設法得到一個可行的解決方法,使用我自己的自定義ContentProvider(它比你想象的更容易!)。由於skink on Google Groups的提示

此代碼應工作,你只需要設置一個供應商的網址並將其註冊爲清單文件

package sirocco.widgets; 

import java.io.FileNotFoundException; 
import java.io.IOException; 

import android.content.ContentProvider; 
import android.content.ContentValues; 
import android.content.res.AssetFileDescriptor; 
import android.content.res.AssetManager; 
import android.database.Cursor; 
import android.net.Uri; 

public class AssetContentProvider extends ContentProvider { 

    private AssetManager mAssetManager; 
    public static final Uri CONTENT_URI = 
      Uri.parse("content://your.provider.name"); 

    @Override 
    public int delete(Uri arg0, String arg1, String[] arg2) { 
     return 0; 
    } 

    @Override 
    public String getType(Uri uri) { 
     return null; 
    } 

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

    @Override 
    public boolean onCreate() { 
     mAssetManager = getContext().getAssets(); 
     return true; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     return null; 
    } 

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

    @Override 
    public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { 
     String path = uri.getPath().substring(1); 
     try { 
      AssetFileDescriptor afd = mAssetManager.openFd(path); 
      return afd; 
     } catch (IOException e) { 
      throw new FileNotFoundException("No asset found: " + uri); 
     } 
    } 

} 

我希望這可以幫助任何Google員工在那裏與供應商同樣的問題!

+0

是的,非常感謝!直到第二次我仔細觀察它時,我才意識到我可以簡單地使用Uri,如「content:// /」與您的解決方案一起使用。對於不應存在IMO的問題的簡單解決方案。 : - | – mharper

0

您需要將所有圖像放在您的資源目錄中。例如:

/root/res/drawable/background_numbers.png 

並且你可以通過訪問:

numBgImage.setImageResource(R.drawable.background_numbers); 
+1

是的,我知道這是一種可能性,但它也應該可以放置在資產目錄中。發佈新版本時,資源ID不會更改。 –

+0

重新編譯應用程序時,所有資源id都會更改,這是一種常態。您可以使用R類引用特定的ID,以便即使值發生更改也不會影響任何內容。 – HandlerExploit

+0

是的,我知道它是如何工作的。它只會在您添加或刪除資源時更改值。我是爲我的小部件驅動一些皮膚的數據。我使用的是URI,所以資源不是「永久」的,但資產應該是。我將uris存儲在每個部件的sharedprefs中 –

0

我建議你仔細檢查:

  • 出現在您的logcat

    ImageView的活動屬於同apk你的代碼。資產文件只能在您的應用程序中讀取。

  • 資產文件夾位於項目目錄根目錄中。

編輯

這似乎是不可能直接從資產的ressource養活ImageView。有關說明,請參見this question。 作爲一種變通方法,你應該嘗試從資源文件創建一個可繪製,然後使用ImageView.setImageDrawable圖像視圖相關聯:

Drawable d = Drawable.createFromStream(getAssets().open("background_numbers.png"), null); 
if (null != d) numBgImage.setImageDrawable(d); 

這段代碼的第一行是this answer從@IgorKhomenko適應。

+0

謝謝。我檢查了日誌,這絕對是來自我的應用程序的錯誤。我解壓縮APK以檢查它是否在正確的位置,但/assets/background_numbers.png在那裏。我成功地從資產中加載了一個字體和一些屬性文件,這只是因爲某種原因無法工作的URI。 –

+0

@Ash麥康奈爾,請你詳細的numBgImage類型,並提供額外的代碼? –

+0

numBgImage是一個ImageView。這裏是我如何得到它: - ImageView numBgImage =(ImageView)layout.findViewById(R.id.numBackground); –

相關問題