将我的项目升级到Android O后
buildToolsVersion "26.0.1"
Run Code Online (Sandbox Code Playgroud)
Android Studio中的Lint显示以下通知构建器方法的已弃用警告:
new NotificationCompat.Builder(context)
Run Code Online (Sandbox Code Playgroud)
问题是: Android开发人员更新了描述NotificationChannel的文档以支持Android O中的通知,并为我们提供了一个代码段,但使用了相同的弃用警告:
Notification notification = new Notification.Builder(MainActivity.this)
.setContentTitle("New Message")
.setContentText("You've received new messages.")
.setSmallIcon(R.drawable.ic_notify_status)
.setChannelId(CHANNEL_ID)
.build();
Run Code Online (Sandbox Code Playgroud)
我的问题:是否还有其他解决方案可用于构建通知,并且仍然支持Android O?
我找到的解决方案是将通道ID作为Notification.Builder构造函数中的参数传递.但是这种解决方案并不完全可以重复使用.
new Notification.Builder(MainActivity.this, "channel_id")
Run Code Online (Sandbox Code Playgroud) 我已经开始从许多代码位置接收几个奇怪的ANR报告(应用程序无响应).
输入调度超时(等待,因为没有窗口具有焦点,但有一个专注的应用程序,最终可能在完成启动时添加窗口.)
这个ANR总是在我的代码中的不同位置弹出,并且它们不遵循逻辑模式.我在一个月前开始收到这些错误.
有一些ANR报告的例子和他各自的代码行:
at android.support.v7.app.AppCompatActivity.setContentView (AppCompatActivity.java:139)
at br.com.xxx.xxx.activities.MainActivity.onCreate (MainActivity.java:71)
at android.app.Activity.performCreate (Activity.java:6245)
MainActivity.java:71: setContentView(R.layout.activity_main);
Run Code Online (Sandbox Code Playgroud)
另一个例子:
at android.support.v4.app.BackStackRecord.replace (BackStackRecord.java:421)
at br.com.xxx.xxx.activities.MainActivity.openFragment (MainActivity.java:146)
at br.com.xxx.xxx.activities.MainActivity.openMenu (MainActivity.java:121)
currentFragment = new CardsFragment();
MainActivity.java:146: openFragment(currentFragment);
Run Code Online (Sandbox Code Playgroud)
那个甚至没有参考代码:
at java.lang.Object.wait! (Native method)
- waiting on <0x0a7b02dc> (a java.lang.Object)
at java.lang.Thread.parkFor$ (Thread.java:1220)
- locked <0x0a7b02dc> (a java.lang.Object)
at sun.misc.Unsafe.park (Unsafe.java:299)
at java.util.concurrent.locks.LockSupport.park (LockSupport.java:158)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt (AbstractQueuedSynchronizer.java:810)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly (AbstractQueuedSynchronizer.java:971)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly (AbstractQueuedSynchronizer.java:1278)
at java.util.concurrent.CountDownLatch.await (CountDownLatch.java:203)
at android.app.SharedPreferencesImpl$EditorImpl$1.run (SharedPreferencesImpl.java:366)
at android.app.QueuedWork.waitToFinish (QueuedWork.java:88)
at android.app.ActivityThread.handleStopService (ActivityThread.java:3065)
at android.app.ActivityThread.-wrap21 (ActivityThread.java) …Run Code Online (Sandbox Code Playgroud) FirebaseAuthUserCollisionException当我尝试在Android应用程序中使用Facebook登录时,我开始遇到异常.
com.google.firebase.auth.FirebaseAuthUserCollisionException:已存在具有相同电子邮件地址但登录凭据不同的帐户.使用与此电子邮件地址关联的提供商登录.
我使用Firebase来处理注册,Facebook使用com.facebook.login.widget.LoginButton视图作为触发器来提供"一键式"登录方法.
这些登录方法已经有效.我能够在Facebook注册一个帐户,并使用相同的方法登录此帐户.但现在已经开始抛出这个例外了.
这是我从Facebook注册帐户并继续登录的代码:
private void handleFacebookAccessToken(AccessToken token) {
final ProgressDialog dialog = new ProgressDialog(this);
dialog.show(getString(R.string.dialog_wait));
firebaseAuth.signInWithCredential(FacebookAuthProvider.getCredential(token.getToken()))
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
dialog.close();
registerNewUserFromSocialLogin(firebaseAuth.getCurrentUser());
} else {
if(task.getException() instanceof FirebaseAuthUserCollisionException) {
//TODO: handle sign-in with different credentials
} else {
dialog.close();
LoginManager.getInstance().logOut();
Toast.makeText(LoginActivity.this,
R.string.error_login,
Toast.LENGTH_SHORT).show();
}
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我的Gradle文件与当前使用库:
compile 'com.google.firebase:firebase-auth:10.2.1'
compile 'com.facebook.android:facebook-android-sdk:[4,5)'
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:我不知道如何处理FirebaseAuthUserCollisionException …
android facebook facebook-graph-api firebase firebase-authentication
我已经更新了我的项目来实施Providers。整个实现看起来是正确的,但我StringIndexOutOfBoundsException在FileProvider课堂上收到异常。
在我的例子中,创建了一个意图,用户可以在其中选择从他的图库中获取图像还是拍摄新照片。
这就是创建我的意图之一的地方,然后将其包含在列表中以创建选择器。
File file = getTempFile(context);
if (file != null) {
Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
takePhotoIntent.putExtra("return-data", true);
takePhotoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT,
FileProvider.getUriForFile(context, // line 43
BuildConfig.APPLICATION_ID.concat(".fileprovider"),
file));
intentList = addIntentsToList(context, intentList, takePhotoIntent);
}
Run Code Online (Sandbox Code Playgroud)
getTempFile方法:
private static File getTempFile(Context context) {
File imageFile = new File(context.getExternalCacheDir(), TEMP_IMAGE_NAME);
if (imageFile.getParentFile().mkdirs()) {
return imageFile;
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
抛出的异常:
java.lang.StringIndexOutOfBoundsException: length=86; index=87
at java.lang.String.substring(String.java:1939)
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:728)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:404)
at com.project.helper.ImagePicker.getPickImageIntent(ImagePicker.java:43)
Run Code Online (Sandbox Code Playgroud)
在这种情况下我该如何进行?也许这是这个版本的 Provider …
我收到有关同一错误的多次崩溃报告,但我不知道可能导致它的原因.
是抛出的异常是ArrayIndexOutOfBoundsException在android.widget.TextView.makeSingleLayout.
我知道它不是关于Android版本和设备类型,因为它从多个版本和设备获取报告.
以下是我从Crashlytics获得的内容:
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=125; index=-1
at android.text.StaticLayout.calculateEllipsis(StaticLayout.java:785)
at android.text.StaticLayout.out(StaticLayout.java:704)
at android.text.StaticLayout.generate(StaticLayout.java:410)
at android.text.StaticLayout.<init>(StaticLayout.java:140)
at android.widget.TextView.makeSingleLayout(TextView.java:6199)
at android.widget.TextView.makeNewLayout(TextView.java:6056)
at android.widget.TextView.onMeasure(TextView.java:6432)
at android.view.View.measure(View.java:16653)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1231)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
at android.view.View.measure(View.java:16653)
at android.widget.ListView.setupChild(ListView.java:1870)
at android.widget.ListView.makeAndAddView(ListView.java:1793)
at android.widget.ListView.fillDown(ListView.java:691)
at android.widget.ListView.fillFromTop(ListView.java:752)
at android.widget.ListView.layoutChildren(ListView.java:1616)
at android.widget.AbsListView.onLayout(AbsListView.java:2087)
at android.view.View.layout(View.java:14973)
at android.view.ViewGroup.layout(ViewGroup.java:4637)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:636)
at android.view.View.layout(View.java:14973)
at android.view.ViewGroup.layout(ViewGroup.java:4637)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
at android.view.View.layout(View.java:14973)
at android.view.ViewGroup.layout(ViewGroup.java:4637)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1167)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:852)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:871)
at android.view.View.layout(View.java:14973)
at android.view.ViewGroup.layout(ViewGroup.java:4637)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at …Run Code Online (Sandbox Code Playgroud)