【发布时间】: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