簡體   English   中英

嘗試檢索通話記錄時的 Android Studio 光標錯誤代碼

[英]Android Studio Cursor Error code when trying to retrieve call log

我正在開發一個簡單的電話應用程序,該應用程序顯示通話記錄,聯系人還提供了呼叫某人“它只是一個電話呼叫者”的可能性。 問題是當我嘗試使用游標檢索呼叫日志列表時,我收到一個錯誤(紅線),指出該值必須 >= 0。

這是我的片段代碼

public class CallLogFragment extends Fragment {

    private RecyclerView recyclerView;
    private ArrayList<ModelCalls> arrayList;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.call_log_fragment, container, false);

        recyclerView = view.findViewById(R.id.call_log_rv);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        RecyclerView.LayoutManager layoutManager = linearLayoutManager;
        recyclerView.setLayoutManager(layoutManager);
        CallLogAdapter adapter = new CallLogAdapter(getContext(), getCallLog());
        recyclerView.setAdapter(adapter);
        return view;
    }

    private ArrayList<ModelCalls> getCallLog() {
        Cursor cursor = getContext().getContentResolver().query(
                CallLog.Calls.CONTENT_URI,
                null,
                null,
                null,
                CallLog.Calls.DATE + " ASC"
        );

        String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
        String duration = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION));
        String date = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE));
        String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));

        cursor.moveToFirst();
        while (cursor.moveToNext()) {
            ModelCalls modelCalls = new ModelCalls(date, number, duration, name);
            arrayList.add(modelCalls);
        }
        return arrayList;
    }
}

這是 MainActivity 代碼:

public class MainActivity extends AppCompatActivity {

    private String[] PERMISSIONS;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PERMISSIONS = new String[]{
                Manifest.permission.READ_CONTACTS,
                Manifest.permission.READ_CALL_LOG,
                Manifest.permission.WRITE_CALL_LOG
        };
        if (!EasyPermissions.hasPermissions(this, PERMISSIONS)){

            EasyPermissions.requestPermissions(this,
                    "Please allow Phone to access all the permissions",
                    123,
                    PERMISSIONS);
        }


        MaterialToolbar toolbar = findViewById(R.id.toolbar);
        BottomNavigationView navigationView = findViewById(R.id.bottom_nav_view);
        setSupportActionBar(toolbar);

        getSupportActionBar().setTitle("Phone");
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                new CallLogFragment()).commit();


        navigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                int id = item.getItemId();
                Fragment selectedFragment = null;
                switch (id){
                    case R.id.nav_phone:
                        selectedFragment = new CallLogFragment();
                        getSupportActionBar().setTitle("Phone");
                        break;
                    case R.id.nav_contacts:
                        selectedFragment = new ContactsFragment();
                        getSupportActionBar().setTitle("Contacts");
                        break;
                    case R.id.nav_favorites:
                        selectedFragment = new FavoritesFragment();
                        getSupportActionBar().setTitle("Favorites");
                        break;
                }

                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        selectedFragment).commit();
                return true;
            }
        });
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
}

我將這些權限添加到清單文件中:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
    <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>

這是我運行應用程序時的錯誤:

2021-09-20 16:13:32.725 10584-10584/? E/AndroidRuntime:致命異常:主進程:com.highui.myphone,PID:10584 android.database.CursorIndexOutOfBoundsException:請求索引 -1,android.database.AbstractCursor.checkPosition(AbstractCursor.java:515) 的大小為 1285在 android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:138) 在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:52) 在 android.database.CursorWrapper.getString(CursorWrapper.java:141high) myphone.CallLogFragment.getCallLog(CallLogFragment.java:50) 在 com.highui.myphone.CallLogFragment.onCreateView(CallLogFragment.java:36) 在 androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963) 在 androidx.fragment .app.FragmentStateManager.createView(FragmentStateManager.java:518) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)碎片 t.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3androidManager.java) .fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072) at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251) at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502) at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1440) at android.app.Activity.performStart(Activity.java:8109) at android.app .ActivityThread.handleStartActivity(ActivityThread.java:3806) 在 android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:235) 在 android.app.servertransaction.TransactionExecutor.cycleToPath(Transactio) nExecutor.java:215) 在 android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:187) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:105) 在 android.app.ActivityThread$H.handleMessage (ActivityThread.java:2386) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:213) at android.app.ActivityThread.main(ActivityThread.java: 8178) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:1101)

您正在嘗試從循環外部獲取信息,並且光標也沒有特定的投影。

在游標中添加投影並從 while 循環內的游標中獲取信息。

像下面的代碼

private ArrayList<ModelCalls> getCallLog() {
    String[] projection = new String[]{
            CallLog.Calls.CACHED_NAME,
            CallLog.Calls.NUMBER,
            CallLog.Calls.DURATION,
            CallLog.Calls.DATE
    };

    Cursor cursor = getContext().getContentResolver().query(
            CallLog.Calls.CONTENT_URI,
            projection,
            null,
            null,
            CallLog.Calls.DATE + " ASC"
    );

    cursor.moveToFirst();
    while (cursor.moveToNext()) {

        String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
        String duration = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION));
        String date = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE));
        String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));

        ModelCalls modelCalls = new ModelCalls(date, number, duration, name);
        arrayList.add(modelCalls);
    }
    cursor.close();

    return arrayList;
}

暫無
暫無

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

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