根据 docs 文件路径访问权限在 Android R 中被授予:
从 Android 11 开始,具有 READ_EXTERNAL_STORAGE 权限的应用可以使用直接文件路径和本机库读取设备的媒体文件。这项新功能使您的应用程序可以更顺畅地与第三方媒体库配合使用。
问题是我无法从中获取文件路径MediaStore,那么我们应该如何读取无法访问/检索的文件路径?有没有办法,我不知道,我们可以从中获取文件路径MediaStore?
此外,文档说明如下:
所有文件访问
某些应用程序的核心用例需要广泛的文件访问,例如文件管理或备份和恢复操作。他们可以通过执行以下操作获得所有文件访问权限:
- 声明 MANAGE_EXTERNAL_STORAGE 权限。
- 将用户引导至系统设置页面,他们可以在其中为您的应用启用允许访问管理所有文件选项。
此权限授予以下权限:
- 对共享存储中所有文件的读访问和写访问。
- 访问 MediaStore.Files 表的内容。
但是我不需要所有文件访问权限,我只希望用户从中选择一个视频MediaStore并将文件路径传递给FFmpeg(它需要一个文件路径)。我知道我不能再使用该_data列来检索文件路径。
请注意:
Uri是从MediaStore文件中返回的,并且不指向文件。FFmpeg,但我可以在 Android R 之前做到这一点。FileDescriptor给FFmpeg我不能使用/proc/self/fd/(我/proc/7828/fd/70: Permission denied从 SD 卡中选择文件时得到),看看这个问题。那我该怎么办,我是不是错过了什么?是什么意思can read a device's media files using direct file paths and native libraries …
按照文档,
我尝试查询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) Android Q 限制对 IMEI 和序列号的访问。它仅适用于具有特殊运营商许可的平台和应用程序。此外,权限 READ_PRIVILEGED_PHONE_STATE 不适用于非平台应用程序。
现有版本(Android P、Android O、Android M)我们使用序列号来唯一标识设备。现在,我们在尝试访问设备标识符时遇到了以下异常。
Android Q 限制对 IMEI 和序列号的访问。
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) 让我首先解释如何从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) 我有一个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) 我正在使用导航组件,并且在主活动中有一个底部导航视图。当我点击该底部导航视图中的选项卡时,出现该片段时似乎动画淡入了。我认为我没有手动设置动画,似乎默认情况下该动画会存在。
我想删除该动画。这是我在主要活动中使用的代码。
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
我目前有一个应用程序,用户单击浮动操作按钮并选择一个视频文件,然后将该文件保存到另一个文件夹.我想显示所有视频的缩略图.我已经看过一个教程系列,它用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) android ×7
java ×3
android-11 ×1
android-architecture-components ×1
kotlin ×1
mediastore ×1
sqlite ×1
video ×1