簡體   English   中英

圖像Uri錯誤

[英]Image Uri Error

我正在創建一個通訊錄應用程序,我想從通訊錄數據庫中獲取通訊錄圖像。 我一直收到此Uri錯誤。 似乎錯誤出現在第97行:@ thumb.setImageURI(uri); 請協助我做什么。 謝謝。

這是我的AddressBook.java類

package com.rufflez.viewpagerexample;

import android.support.v4.app.ListFragment;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ContentUris;
import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts;
import android.provider.ContactsContract;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;

public class AddressBook extends ListFragment implements 
LoaderCallbacks<Cursor>{

private CursorAdapter mAdapter;
public ListView listView;
public Cursor cursor;


public static final String[] FROM = { ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, ContactsContract.Contacts.PHOTO_THUMBNAIL_URI };
private static final int[] TO = { R.id.text_name, R.id.contact_thumbnail };

int layout = R.layout.contact_list_item;



// Name should be displayed in the text1 TextView in item layout

private Context context;
public View view;
public static Uri uri;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // delete list if already there (old version)
    if (!(listView == null)){
        listView.setAdapter(null);
    }

    // create adapter once
    context = getActivity();
    int layout = android.R.layout.simple_list_item_1;
    Cursor c = null; // there is no cursor yet
    int flags = 0; // no auto-requery! Loader requeries.

    // put List in adapter
    mAdapter = new SimpleCursorAdapter(context, layout, c, FROM, TO, flags);



} // end onCreate


// columns requested from the database
private static final String[] PROJECTION = {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,
    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
    ContactsContract.Contacts.HAS_PHONE_NUMBER,
    ContactsContract.Contacts.IN_VISIBLE_GROUP
};

// this goes in the CursorLoader parameter list, it filters
// out only those contacts who have a phone number
private static final String SELECTION = 
        ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'";

// Empty public constructor, required by the system
public AddressBook() {}

// A UI Fragment must inflate its View (all fragments must override onCreateView)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the fragment layout
    View view =  inflater.inflate(R.layout.contact_list_view,
            container, false);
    listView = (ListView) view.findViewById(R.id.list); 

    // set Contact photo to ImageView
    AddressBook frag = new AddressBook();
    ImageView thumb = (ImageView)view.findViewById(R.id.contact_thumbnail);
    frag.getPhotoUriFromID(ContactsContract.Contacts._ID);
    thumb.setImageURI(uri);
    return view;
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // and tell loader manager to start loading
//  getLoaderManager().initLoader(0, null, this);

    listView.setAdapter(mAdapter);
    listView.setFastScrollEnabled(true);

}

// a CursorLoader does a query in the background
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // load from the "Contacts table"
    Uri contentUri = Contacts.CONTENT_URI;

    // no sub-selection, no sort order, simply every row
    // projection says we want just the _id and the name column
    return new CursorLoader(getActivity(),
            contentUri,
            PROJECTION,
            SELECTION,
            null,
            ContactsContract.Contacts.DISPLAY_NAME
            );
}

private Uri getPhotoUriFromID(String id) {
    try {
        Cursor cur = context.getContentResolver()
                .query(ContactsContract.Data.CONTENT_URI,
                        null,
                        ContactsContract.Data.CONTACT_ID
                        + "="
                        + id
                        + " AND "
                        + ContactsContract.Data.MIMETYPE
                        + "='"
                        + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
                        + "'", null, null);
        if (cur != null) {
            if (!cur.moveToFirst()) {
                return null; // no photo
            }
        } else {
            return null; // error in cursor process
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    Uri person = ContentUris.withAppendedId(
            ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
    uri = Uri.withAppendedPath(person,
            ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    return uri;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // Once cursor is loaded, give it to adapter
    mAdapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    // Delete the reference to the existing Cursor,
    // so it can recycle it
    mAdapter.swapCursor(null);
}
}

這是contact_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" >

</ListView>

這是我的contact_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
    android:id="@+id/contact_thumbnail"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher" />

<TextView
    android:id="@+id/text_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"/>

</LinearLayout>

這是我的Logcat錯誤

09-03 20:08:15.241: E/AndroidRuntime(5257): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageURI(android.net.Uri)' on a null object reference
09-03 20:08:15.241: E/AndroidRuntime(5257):     at com.rufflez.viewpagerexample.AddressBook.onCreateView(AddressBook.java:97)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.view.View.measure(View.java:18580)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:874)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:612)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.view.View.measure(View.java:18580)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.view.View.measure(View.java:18580)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827)
09-03 20:08:15.241: E/AndroidRuntime(5257):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447)

您正在嘗試設置一個“不存在”的uri ... thumb.setImageURI(uri); 將始終為null。

我認為縮略圖會出現在您的列表視圖中,因此...您需要設置:

thumb.setImageURI(uri); 在您的自定義適配器中。

一旦應用程序加載,您現在執行的方式(在代碼中有錯誤位置的詳細信息)正在嘗試獲取uri,甚至在設置適配器,獲取數據等之前……uri始終為null。

您的片段使用contact_list_view.xml布局,該布局僅包含一個ListView 第一次(ImageView)view.findViewById(R.id.contact_thumbnail);該列表時,它不包含(ImageView)view.findViewById(R.id.contact_thumbnail); ,因此(ImageView)view.findViewById(R.id.contact_thumbnail); 將返回null,因為您只有一個ListView

核心問題是,為ListView填充和填充子視圖是適配器的工作。 您不應該嘗試從Fragment內引用contact_list_item.xml任何視圖。 這些視圖不僅完全可能還不存在,這樣做還限制了您只能使用列表的一行,而不是用其各自的數據填充每一行。

public static Uri uri; in not initalized(始終為null )。

我和Uri有問題。 重新創建我的活動時,它將變量Uri的值設置為null。 這個事實使我的應用程序崩潰了,因為它使用它保存了實例。 如何預防呢? 以某種方式保存Uri變量的值。 進行sqlite,sharedpreferences或bundle或任何其他選擇。 並且當重新創建檢查時,其值不為null。 如果是真的,則從內存中獲取保存的值。 正如我提醒調用Uri.parseString或smth類似。 我認為你有這樣的問題。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM