小编Bry*_*yan的帖子

如何正确保存到图片文件夹

我正在尝试将用户创建的位图保存到设备上的默认“图片”文件夹中。我将从似乎是更常见方法的选项开始:

public void saveImageToExternalStorage(String filename, Bitmap image) {
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
    try {
        File directory = new File(path);
        if (!directory.exists()) {
            directory.mkdirs();
        }

        File file = new File(directory, filename + ".jpeg");
        file.createNewFile();

        OutputStream outputStream = new FileOutputStream(file);
        image.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);

        outputStream.flush();
        outputStream.close();
    } catch (IOException exception) {
        exception.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该保存到“图片”文件夹中,但Environment.getExternalStorageDirectory().getAbsolutePath()似乎创建了一个这样的新文件结构file://storage/emulated/11/Pictures/并将图片保存到那个文件夹中。我也试过Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)同样的结果。但这不是我的任何测试设备或模拟器上的默认“图片”文件夹。这让我寻找其他方法,我发现了这个:

public void saveImageToExternalStorage(String filename, Bitmap image) {
    try {
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, filename);
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); …
Run Code Online (Sandbox Code Playgroud)

android image bitmap save mediastore

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

棉花糖指纹扫描仪硬件存在

我期待着开始使用Marshmallow指纹认证API.我理解要求获得许可,我必须使用以下方法:

ContextCompat.checkSelfPermission(getContext(), Manifest.permission.USE_FINGERPRINT);
Run Code Online (Sandbox Code Playgroud)

我必须检查设备是否正在运行API级别23或更高级别.但在我要求许可之前,我想检查设备是否真的有一个指纹扫描仪开始.我找到了以下两种方法来检查:

FingerprintManager manager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);

manager.isHardwareDetected();

manager.hasEnrolledFingerprints();
Run Code Online (Sandbox Code Playgroud)

但是这两种方法都需要被USE_FINGERPRINT许可才能被调用.为什么我要求使用我甚至不知道存在的指纹扫描仪?有没有其他方法可以确定扫描仪是否存在?或者是首先要求许可的唯一方法?

android android-permissions android-6.0-marshmallow android-fingerprint-api

5
推荐指数
2
解决办法
4352
查看次数

无法启动模拟器

我是 iOS 开发新手。我的问题是当我运行我的项目时,模拟器出现黑屏,并显示一条消息“无法启动模拟器”。我正在使用 Xcode 版本 7.3.1。

在此输入图像描述

xcode simulator ios

5
推荐指数
3
解决办法
5902
查看次数

底部工作表向下滑动行为

我已经成功地ListView在一个Fragment. 从列表中,我还设法成功加载了底部工作表。

  1. 如果我点击列表“一个”中的第一项,则会出现底部工作表。

  2. 如果我点击底部工作表的外部,底部工作表就会消失。

  3. 如果我点击列表中的第二个项目“Two”,底部的表格会再次出现。

  4. 如果我再次执行 1) 然后向下滑动底部工作表并尝试执行 3),屏幕将保持灰色,就好像底部工作表仍然显示但不可见...... ???

我该如何纠正?

下面是我的代码。

SecondFragment.java

/**
 * A simple {@link Fragment} subclass.
 */
public class SecondFragment extends Fragment {
    public SecondFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_second, container, false);

        String[] faList = { 
                "One",
                "Two",
        };

        ListView listView = (ListView) view.findViewById(R.id.listFa);

        ArrayAdapter<String> listviewAdapter = new ArrayAdapter<String>(
                getActivity(),
                android.R.layout.simple_list_item_1,
                faList
        );

        listView.setAdapter(listviewAdapter);

        // …
Run Code Online (Sandbox Code Playgroud)

android swipe-gesture bottom-sheet

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

具有更多控制力的本地化日期/时间

我正在使用 ThreeTen-Backport (特别是ThreeTenABP)来显示项目中的时间戳。我希望显示的时间戳以本地化格式显示(基于Locale系统的);使用以下任一方法都很容易DateTimeFormatter.ofLocalizedDateTime()

\n\n
DateTimeFormatter formatter = DateTimeFormatter\n        .ofLocalizedDateTime(FormatStyle.LONG)\n        .withLocale(Locale.getDefault())\n        .withZone(ZoneId.systemDefault());\n\nString timestamp = formatter.format(Instant.now());\n
Run Code Online (Sandbox Code Playgroud)\n\n

FormatStyle问题是我对只有四种类型(SHORTMEDIUMLONG、 )的格式化程序的输出没有太多控制FULL。我很好奇是否有一种方法可以对输出进行更精细的控制,而不丢失本地化格式。

\n\n
\n\n

timestamp使用前面的代码,区域设置的结果"en_US"将是:

\n\n
"January 23, 2017 1:28:37 PM EST"\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然区域设置的结果"ja_JP"是:

\n\n
"2017\xe5\xb9\xb41\xe6\x9c\x8823\xe6\x97\xa5 13:28:37 GMT-5:00"\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,每个区域设置都使用特定的模式,并使用默认的 12 或 24 小时格式。我想保留本地化模式,但更改一些内容,例如是否显示时区,或者是否使用 12 小时或 24 小时格式。

\n\n

例如; 如果我可以将两个区域设置设置为使用 12 小时格式,并删除时区;结果如下所示:

\n\n
"January 23, 2017 1:28:37 PM"\n\n"2017\xe5\xb9\xb41\xe6\x9c\x8823\xe6\x97\xa5 1:28:37\xe5\x8d\x88\xe5\xbe\x8c"\n
Run Code Online (Sandbox Code Playgroud)\n

java android localization threetenbp

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

在Android P上创建设置活动

SettingsActivity目前扩展了Android Studio生成的类,AppCompatPreferenceActivity扩展了它PreferenceActivity.活动中的每个首选项屏幕都使用PreferenceFragment; 从API级别28开始,不推荐使用它.文档声明您应该使用PreferenceFragmentCompat支持库中的类作为替代.

问题是PreferenceFragmentCompat扩展android.support.v4.app.Fragment(而不是android.app.Fragment)PreferenceActivity不支持.并没有PreferenceActivityCompat填补现在无关紧要的角色PreferenceActivity.

进一步混淆了这个问题; 新的androidx.preference支持库包括它自己的PreferenceFragment(扩展android.app.Fragment) PreferenceFragmentCompat(扩展新的androidx.fragment.app.Fragment).

我总是可以PreferenceActivity使用我自己的类重新创建功能,但为什么文档建议使用PreferenceFragmentCompat没有可行的替代方案PreferenceActivity?我错过了什么,或者偏好库的当前状态不起作用?


现在的SettingsActivity工作原样,但我通常想尝试超越曲线,特别是当某些东西被弃用时.

android android-preferences android-support-library androidx

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

"无法注册本机方法"错误的原因?

我正在做两个项目; 一个更小(我会称之为ProjectA),而另一个则相当大(ProjectB).两个项目都使用相同的库,即IMG.LYPhoto Editor SDK.对于这两个项目,我遵循了库文档中的简单集成步骤.

ProjectA使用自定义Activity来显示和选择图像,而ProjectB只是使用简单的ACTION_PICK意图来选择图像.两个项目都有类似的方法来PhotoEditorActivity选择图像后启动; 除了ProjectA接受File参数的方法,而另一个接受一个Uri:

private void dispatchEditorIntent(File file /* Uri uri */) {
    new PhotoEditorIntent(getActivity())
            .setExportDir(PhotoEditorIntent.Directory.PICTURES, getString(R.string.app_name))
            .setExportPrefix(Constants.PREFIX_EDITOR)
            .setSourceImagePath(file.getAbsolutePath()) // uri.getPath() for ProjectB
            .destroySourceAfterSave(false)
            .startActivityForResult(REQUEST_EDITOR);
}
Run Code Online (Sandbox Code Playgroud)

如果我在任一项目中选择相同的图像,file.getAbsolutePath()或者uri.getPath()方法将返回相同的图像String; 例如:

/storage/emulated/0/Pictures/IMG_20160929_145318_395198580.jpeg

ProjectA工作正常,但在ProjectBdispatchEditorIntent被调用时,我遇到了一个巨大的错误消息.为简洁起见,我只包括每个错误和警报日志的前10行:

09-29 14:53:26.585 4272-4272/com.example.projectb E/art: Failed to register native method android.support.v8.renderscript.RenderScript.nDeviceDestroy(J)V …
Run Code Online (Sandbox Code Playgroud)

android renderscript

4
推荐指数
1
解决办法
4176
查看次数

GSON自定义反序列化器处理空

我写了一个自定义的GSON类型适配器android.net.Uri:

public class UriAdpter extends TypeAdapter<Uri> {

    @Override
    public void write(JsonWriter out, Uri value) throws IOException {
        out.value(value.toString());
    }

    @Override
    public Uri read(JsonReader in) throws IOException {
        return Uri.parse(in.nextString());
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,直到我解析的JSON提要给了我一个nullURI 的值.然后它扔了一个JsonSyntaxException:

03-30 08:40:00.799 16340-16340/com.example.app D/NewsFragment: Failed to retrieve articles
        com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was NULL at line 1 column 23588 path $.data[5].thumbnail
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
            at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:116)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216)
            at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
            at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
            at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116) …
Run Code Online (Sandbox Code Playgroud)

android json gson json-deserialization

3
推荐指数
1
解决办法
810
查看次数

是否可以根据类方法响应有条件地显示 XML 包含?

我想知道是否可以使用 DataBinding 根据方法布尔响应有条件地显示布局。这就是我想要做的

XML 布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="View"
            type="android.view.View"/>

        <variable
            name="App"
            type="com.app.JTApp"/>
    </data>

    <include layout="@layout/view_checkout_total_cardview"
             android:visibility="@{App.isLandscape() ? View.GONE : View.VISIBLE}" />

</layout>
Run Code Online (Sandbox Code Playgroud)

JTApp 类:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="View"
            type="android.view.View"/>

        <variable
            name="App"
            type="com.app.JTApp"/>
    </data>

    <include layout="@layout/view_checkout_total_cardview"
             android:visibility="@{App.isLandscape() ? View.GONE : View.VISIBLE}" />

</layout>
Run Code Online (Sandbox Code Playgroud)

目前这不起作用。我错过了什么或者这是不可能的吗?我来自网络,使用 Angular 等框架可以做到这一点。

xml android android-databinding

3
推荐指数
1
解决办法
2737
查看次数

替换导航视图项波纹效果

我试图替换我认为是NavigationView. 所以我创建了一个 drawable 来替换背景并使用itemBackground属性应用它。

background_navigation_view_item.xml

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/navigation_item_background_tint">
    <item android:id="@android:id/mask" android:top="4dp" android:bottom="4dp" android:left="8dp" android:right="8dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
            <corners android:radius="3dp"/>
        </shape>
    </item>
    <item android:top="4dp" android:bottom="4dp" android:left="8dp" android:right="8dp">
        <selector>
            <item android:state_checked="true">
                <shape android:shape="rectangle">
                    <solid android:color="@color/navigation_item_background_tint"/>
                    <corners android:radius="3dp"/>
                </shape>
            </item>
            <item>
                <shape android:shape="rectangle">
                    <solid android:color="@android:color/transparent"/>
                    <corners android:radius="3dp"/>
                </shape>
            </item>
        </selector>
    </item>
</ripple>
Run Code Online (Sandbox Code Playgroud)

当项目被选中时,项目背景可绘制看起来很棒(“选择控件”是下图中的选定项目)。但被点击该项目时(“进度指标”下文)看来该默认波纹绘制两者所述background_navigation_view_item.xml可绘制正在使用(仅一个圆角矩形应该显示,而不是周围的矩形)。

导航视图波纹效果

我还测试了 drawable 作为可检查视图的背景,它的工作方式符合我的预期。因此,如果我的可绘制对象的代码中没有错误,为什么不替换原始背景可绘制对象?

android android-drawable navigation-drawer android-navigationview android-jetpack

3
推荐指数
1
解决办法
866
查看次数