[英]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.