小编Gui*_*FGL的帖子

在Android O中不推荐使用NotificationCompat.Builder

将我的项目升级到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)

notifications android android-notifications

139
推荐指数
6
解决办法
12万
查看次数

Android ANR - 输入调度超时

我已经开始从许多代码位置接收几个奇怪的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)

android android-anr-dialog

14
推荐指数
1
解决办法
2773
查看次数

如何处理FirebaseAuthUserCollisionException

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

5
推荐指数
1
解决办法
1519
查看次数

FileProvider.getUriForFile 导致 StringIndexOutOfBoundsException

我已经更新了我的项目来实施Providers。整个实现看起来是正确的,但我StringIndexOutOfBoundsExceptionFileProvider课堂上收到异常。

在我的例子中,创建了一个意图,用户可以在其中选择从他的图库中获取图像还是拍摄新照片。

这就是创建我的意图之一的地方,然后将其包含在列表中以创建选择器。

    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 …

android android-intent android-fileprovider

5
推荐指数
1
解决办法
2573
查看次数

Crashlytics报告TextView.makeSingleLayout的倍数问题

我收到有关同一错误的多次崩溃报告,但我不知道可能导致它的原因.

是抛出的异常是ArrayIndexOutOfBoundsExceptionandroid.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)

android crash-reports crashlytics

2
推荐指数
1
解决办法
447
查看次数