小编HB.*_*HB.的帖子

Android 11 (R) 文件路径访问

根据 docs 文件路径访问权限在 Android R 中被授予:

从 Android 11 开始,具有 READ_EXTERNAL_STORAGE 权限的应用可以使用直接文件路径和本机库读取设备的媒体文件。这项新功能使您的应用程序可以更顺畅地与第三方媒体库配合使用。

问题是我无法从中获取文件路径MediaStore,那么我们应该如何读取无法访问/检索的文件路径?有没有办法,我不知道,我们可以从中获取文件路径MediaStore


此外,文档说明如下

所有文件访问

某些应用程序的核心用例需要广泛的文件访问,例如文件管理或备份和恢复操作。他们可以通过执行以下操作获得所有文件访问权限:

  1. 声明 MANAGE_EXTERNAL_STORAGE 权限。
  2. 将用户引导至系统设置页面,他们可以在其中为您的应用启用允许访问管理所有文件选项。

此权限授予以下权限:

  • 对共享存储中所有文件的读访问和写访问。
  • 访问 MediaStore.Files 表的内容。

但是我不需要所有文件访问权限,我只希望用户从中选择一个视频MediaStore并将文件路径传递给FFmpeg(它需要一个文件路径)。我知道我不能再使用该_data列来检索文件路径。


请注意:

  • 我知道 aUri是从MediaStore文件中返回的,并且不指向文件。
  • 我知道我可以将文件复制到我的应用程序目录并将其传递给FFmpeg,但我可以在 Android R 之前做到这一点。
  • 我不能传递FileDescriptorFFmpeg我不能使用/proc/self/fd/(我/proc/7828/fd/70: Permission denied从 SD 卡中选择文件时得到),看看这个问题

那我该怎么办,我是不是错过了什么?是什么意思can read a device's media files using direct file paths and native libraries …

android android-11

19
推荐指数
3
解决办法
2万
查看次数

IllegalArgumentException:无效的列纬度

按照文档, 我尝试查询ContentResolver以获取文件大小,如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == video_request_code) {
        if (resultCode == RESULT_OK) {
            Uri uri = data.getData();
            Cursor cur = getContentResolver().query(uri, null, null, null, null);
            try {
                if (cur != null && cur.moveToFirst()){
                    if (uri.getScheme() != null){
                        if (uri.getScheme().equals("content")) {
                            int sizeIndex = cur.getColumnIndex(OpenableColumns.SIZE);
                            Log.e("size", ""+cur.getLong(sizeIndex));
                        }else if (uri.getScheme().equals("file")) {
                            File ff = new File(uri.getPath());
                            Log.e("size", ""+ff.length());
                        }
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            } …
Run Code Online (Sandbox Code Playgroud)

java android

6
推荐指数
1
解决办法
1602
查看次数

Android Q 中的唯一标识符

Android Q 限制对 IMEI 和序列号的访问。它仅适用于具有特殊运营商许可的平台和应用程序。此外,权限 READ_PRIVILEGED_PHONE_STATE 不适用于非平台应用程序。

现有版本(Android P、Android O、Android M)我们使用序列号来唯一标识设备。现在,我们在尝试访问设备标识符时遇到了以下异常。

Android Q 限制对 IMEI 和序列号的访问。

android.os.Build 类中的 getSerial()

06-21 12:37:07.460  1250  2555 W DevicePolicyManager: Package com.nagra.nmp.corepaktest (uid=10201, pid=32694) cannot access Device IDs
06-21 12:37:07.460  1250  2555 W TelephonyPermissions: reportAccessDeniedToReadIdentifiers:com.nagra.nmp.corepaktest:getSerial:isPreinstalled=false:isPrivApp=false
06-21 12:37:07.464 32694 32718 W System.err: java.lang.SecurityException: getSerial: The user 10201 does not meet the requirements to access device identifiers.
06-21 12:37:07.464 32694 32718 W System.err:    at android.os.Parcel.createException(Parcel.java:2069)
06-21 12:37:07.464 32694 32718 W System.err:    at android.os.Parcel.readException(Parcel.java:2037)
06-21 12:37:07.465 32694 32718 …
Run Code Online (Sandbox Code Playgroud)

android

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

SQlite返回0

让我首先解释如何从SQLite插入和返回数据.

首先,我创建这样的表:

private static final String CREATE_TABLE_STUDENT_LESSON = " create table STUDENTSPECIFICLESSON ( _id TEXT , _viewID INTEGER PRIMARY KEY AUTOINCREMENT , _LESSON_TITLE TEXT , _LESSON_DATE TEXT , _LESSON_PROBLEM TEXT );";

public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_STUDENT_LESSON);
}
Run Code Online (Sandbox Code Playgroud)

然后我在SQLite中插入这样的表:

public void insertLesson(String _id, String lessonTitle, String lessonDate, String lessonProblem) {
    ContentValues contentValue = new ContentValues();
    contentValue.put(SQLiteHelper._ID, _id);
    contentValue.put(SQLiteHelper.LESSON_TITLE, lessonTitle);
    contentValue.put(SQLiteHelper.LESSON_DATE, lessonDate);
    contentValue.put(SQLiteHelper.LESSON_PROBLEM, lessonProblem);
    this.getWritableDatabase().insert(SQLiteHelper.TABLE_NAME_STUDENTSPECIFICLESSON, null, contentValue);
}
Run Code Online (Sandbox Code Playgroud)

我从Activity中插入它,如下所示:

sqLiteHelper.insertLesson(id,etLessonTitle.getText().toString(),currentDateandTime,etLessonProbStu.getText().toString());
Run Code Online (Sandbox Code Playgroud)

您会注意到我创建了_viewID INTEGER PRIMARY KEY AUTOINCREMENT我正在使用它来获取我的适配器中的特定ViewHolder.

_viewID通过这样做得到这个:

public …
Run Code Online (Sandbox Code Playgroud)

sqlite android

3
推荐指数
2
解决办法
550
查看次数

RecyclerView onClick 给出错误的项目

我有一个RecyclerView显示学生详细信息的列表。我面临的问题是当我单击第一项时,它会返回第二项的数据。我相信这与 有关getAdapterPosition(),但我不确定。

在这种情况下,它会在选择第一个学生时返回第二个学生(项目)的卷号。

任何帮助表示赞赏


回收器视图适配器

public class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.ViewHolder> {
    Context context;
    public List<StudentDataModel> dataModels;
    public StudentDataModel dataAdapter;

    public StudentAdapter(List<StudentDataModel> getDataAdapter, Context context){
        super();
        this.dataModels = getDataAdapter;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.student, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final StudentAdapter.ViewHolder viewHolder, final int position) {
        dataAdapter =  dataModels.get(position);        
        viewHolder.NameStudentCard.setText(dataAdapter.getName());
        viewHolder.RankStudentCard.setText(dataAdapter.getRank());
        viewHolder.RollStudentCard.setText(dataAdapter.getRoll());

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void …
Run Code Online (Sandbox Code Playgroud)

java android android-recyclerview

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

在Android中使用导航组件时如何删除默认动画过渡?

我正在使用导航组件,并且在主活动中有一个底部导航视图。当我点击该底部导航视图中的选项卡时,出现该片段时似乎动画淡入了。我认为我没有手动设置动画,似乎默认情况下该动画会存在。

我想删除该动画。这是我在主要活动中使用的代码。

class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {

    private lateinit var navController : NavController
    lateinit var destinationTitleTextView : TextView
    lateinit var progressBar : ProgressBar
    lateinit var topToolbar : Toolbar
    lateinit var bottomNavigationView : BottomNavigationView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        FirebaseApp.initializeApp(this)

        // Initial Setup views
        navController = Navigation.findNavController(this,R.id.nav_host_fragment)
        setupBottomNavMenu(navController)
        setupActionBar(navController)
        setUpViewDeclaration()


        // Add Listeners
        navController.addOnDestinationChangedListener(this)


    }



    private fun setUpViewDeclaration() {
        destinationTitleTextView = findViewById(R.id.destination_label_text_view)
        progressBar = findViewById(R.id.progressBar_main_activity)
        topToolbar = findViewById(R.id.top_toolbar)
        bottomNavigationView = findViewById(R.id.bottom_nav)

    }

    private fun setupBottomNavMenu(navController: NavController) {
        bottom_nav.setupWithNavController(navController) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-navigation android-architecture-components android-jetpack

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

Android - 视频文件中的缩略图

我目前有一个应用程序,用户单击浮动操作按钮并选择一个视频文件,然后将该文件保存到另一个文件夹.我想显示所有视频的缩略图.我已经看过一个教程系列,它用MediaStore完成,但后来我无法设置uri的路径.

有人可以指点我正确的方向吗?

这是我的班级打开图库并将视频保存到不同的路径:

public class Activity extends AppCompatActivity {
    private static final int pick = 100;
    Uri videoUri;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            openGallery();
            }
        });
    }

    private void openGallery() {
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, pick);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == pick) {
            try …
Run Code Online (Sandbox Code Playgroud)

java video android mediastore

0
推荐指数
1
解决办法
2111
查看次数