2016-09-25 3 views
0

Ich teste das Listview-Beispiel in der Developer site, die ein Beispiel zum Füllen von ListView mit Loader und Adapter ist. Die App schlägt aufgrund einiger unbekannter Fehler fehl. Ich bin mir nicht sicher aber vermute, dass die Aussage getLoaderManager().initLoader(0, null, this); Probleme hat.Wie füllt man ListView mit Loader?

Der Emulator zeigt "Leider hat ListViewLoader gestoppt." Ich habe auch <uses-permission android:name="android.permission.READ_CONTACTS" /> vor <application> Tag verwendet, aber den gleichen Fehler erhalten. in der Manifestdatei. Die logcat zeigt folgende Meldungen:


09-25 22:57:33.853 28524-28618/com.example.listviewloader E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
Process: com.example.listviewloader, PID: 28524 
java.lang.RuntimeException: An error occurred while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:309) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{3c98c11 28524:com.example.listviewloader/u0a108} (pid=28524, uid=10108) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS 
at android.os.Parcel.readException(Parcel.java:1599) 
at android.os.Parcel.readException(Parcel.java:1552) 
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3550) 
at android.app.ActivityThread.acquireProvider(ActivityThread.java:4778) 
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2018) 
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1468) 
at android.content.ContentResolver.query(ContentResolver.java:475) 
at android.content.CursorLoader.loadInBackground(CursorLoader.java:64) 
at android.content.CursorLoader.loadInBackground(CursorLoader.java:56) 
    at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312) 
    at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69) 
    at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66) 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
    at java.lang.Thread.run(Thread.java:818)  09-25 22:57:33.859 28524-28621/com.example.listviewloader D/OpenGLRenderer: Use 
EGL_SWAP_BEHAVIOR_PRESERVED: true 
09-25 22:57:33.863 28524:28524 D/ ] 
HostConnection::get() New Host Connection established 0xaa9e84a0, tid 28524 
    09-25 22:57:34.200 28524-28621/com.example.listviewloader I/OpenGLRenderer: Initialized EGL, version 1.4 
    09-25 22:57:34.910 28524-28621/com.example.listviewloader E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb40943e0 

Vielen Dank im Voraus für jedes Problem im folgenden Code zu finden.


import android.app.ListActivity; 
import android.content.CursorLoader; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.v4.widget.DrawerLayout; 
import android.util.Log; 
import android.view.Gravity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.app.LoaderManager; 
import android.content.Loader; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast;  

public class MainActivity extends ListActivity 
    implements LoaderManager.LoaderCallbacks<Cursor> { 

// This is the Adapter being used to display the list's data 
SimpleCursorAdapter mAdapter; 

// These are the Contacts rows that we will retrieve 
static final String[] PROJECTION = new String[] {ContactsContract.Data._ID, 
     ContactsContract.Data.DISPLAY_NAME}; 

// This is the select criteria 
static final String SELECTION = "((" + 
     ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" + 
     ContactsContract.Data.DISPLAY_NAME + " != ''))"; 

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

    // For the cursor adapter, specify which columns go into which views 
    String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME}; 
    int[] toViews = {android.R.id.text1}; // The TextView in simple_list_item_1 

    // Create an empty adapter we will use to display the loaded data. 
    // We pass null for the cursor, then update it in onLoadFinished() 
    mAdapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, null, 
      fromColumns, toViews, 0); 
    setListAdapter(mAdapter); 

    // Prepare the loader. Either re-connect with an existing one, 
    // or start a new one. 
    getLoaderManager().initLoader(0, null, this); //this seems to be wrong 
} 

// Called when a new Loader needs to be created 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    // Now create and return a CursorLoader that will take care of 
    // creating a Cursor for the data being displayed. 

    return new CursorLoader(this, ContactsContract.Data.CONTENT_URI, 
      PROJECTION, SELECTION, null, null); 
} 

// Called when a previously created loader has finished loading 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    // Swap the new cursor in. (The framework will take care of closing the 
    // old cursor once we return.) 
    mAdapter.swapCursor(data); 
} 

// Called when a previously created loader is reset, making the data unavailable 
public void onLoaderReset(Loader<Cursor> loader) { 
    // This is called when the last Cursor provided to onLoadFinished() 
    // above is about to be closed. We need to make sure we are no 
    // longer using it. 
    mAdapter.swapCursor(null); 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    // Do something when a list item is clicked 
} 
+0

w Möchten Sie das Fehlerprotokoll und die Importanweisungen Ihrer Klasse posten? – Bob

Antwort

0

Die Security und die Erlaubnis Verweigerung gibt die wahrscheinliche Ursache - haben Sie Ihre Anwendung Zugriff lesen gegeben (und möglicherweise schreiben) Ihre Kontakte?

Die Berechtigung, die Sie benötigen, sind:

Read access to one or more tables 
<uses-permission android:name="android.permission.READ_CONTACTS">. 
Write access to one or more tables 
<uses-permission android:name="android.permission.WRITE_CONTACTS">. 
+0

Ich habe uses-permission an der richtigen Stelle hinzugefügt, aber wieder empfangen. "Verursacht von: java.lang.SecurityException: Permission Denial: Öffnen des Providers com.android.providers.contacts.ContactsProvider2 von ProcessRecord {6722488 2445: com.example.ListView/u0a89 } (pid = 2445, uid = 10089) erfordert android.permission.READ_CONTACTS oder android.permission.WRITE_CONTACTS – gnoejh

0

Verursacht durch: java.lang.SecurityException: Permission Denial: Eröffnung Anbieter com.android.providers.contacts.ContactsProvider

wenn Sie laufen Ihre App auf Android 6 oder hiegher nur stellen Sie sicher, dass alle die Erlaubnis, die Sie in Ihrer App benötigen hier gewährt wird, ist ein example

Verwandte Themen