【问题标题】:Android Studio Cursor Error code when trying to retrieve call log尝试检索通话记录时的 Android Studio 光标错误代码
【发布时间】:2021-09-20 15:32:16
【问题描述】:

我正在开发一个简单的电话应用程序,该应用程序显示通话记录和联系人,还提供了给某人打电话的可能性“It's Simply A Phone Caller”。 问题是当我尝试使用光标检索通话记录列表时出现错误(红线),提示该值必须 >= 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/Android运行时:致命 例外:主要 进程:com.highui.myphone,PID:10584 android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为1285 在 android.database.AbstractCursor.checkPosition(AbstractCursor.java:515) 在 android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:138) 在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:52) 在 android.database.CursorWrapper.getString(CursorWrapper.java:141) 在 com.highui.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) 在 androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) 在 androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) 在 androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) 在 androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) 在 androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138) 在 androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072) 在 androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251) 在 androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502) 在 androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246) 在 android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1440) 在 android.app.Activity.performStart(Activity.java:8109) 在 android.app.ActivityThread.handleStartActivity(ActivityThread.java:3806) 在 android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:235) 在 android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.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) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:213) 在 android.app.ActivityThread.main(ActivityThread.java:8178) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)

【问题讨论】:

    标签: android-studio phone-call android-cursor calllog


    【解决方案1】:

    您正在尝试从循环外部获取信息,并且光标没有特定的投影。

    在游标中添加投影并在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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 2023-02-09
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多