如何从Android应用中的设备存储中获取所有视频

时间:2018-01-25 07:26:06

标签: java android

我想在我的应用程序的列表视图中显示手机存储(内部或SD卡)中的所有视频,而我的旧代码在新的7.0设备上提供例外。我的targetSDK API级别为23.我还在IDE中收到一条警告:" managedQuery"方法已弃用。我在项目中使用的方法是:

private boolean getVideoList() {
    Cursor var1 = this.managedQuery(Media.EXTERNAL_CONTENT_URI, new String[]{"_data", "_id", "_display_name", "duration"}, (String)null, (String[])null, " _id DESC");
    int var2 = var1.getCount();
    if(var2 <= 0) {
        return false;
    } else {
        var1.moveToFirst();

        for(int var4 = 0; var4 < var2; ++var4) {
            Uri var5 = Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI, ContentUtill.getLong(var1));
            String var6 = var1.getString(var1.getColumnIndexOrThrow("_display_name"));
            String var7 = var1.getString(var1.getColumnIndex("_data"));
            String var8 = ContentUtill.getTime(var1, "duration");
            VideoData var9 = new VideoData(var6, var5, var7, var8);
            this.videoList.add(var9);
            var1.moveToNext();
        }

        return true;
    }
}

例外是:

Caused by: java.lang.SecurityException: 
  at android.os.Parcel.readException (Parcel.java:1693)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:183)
  at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:135)
  at android.content.ContentProviderProxy.query (ContentProviderNative.java:421)
  at android.content.ContentResolver.query (ContentResolver.java:536)
  at android.content.ContentResolver.query (ContentResolver.java:478)
  at android.app.Activity.managedQuery (Activity.java:2368)
  at video.format.converter.view.SelectVideoActivity.getVideoList (SelectVideoActivity.java:61)
  at video.format.converter.view.SelectVideoActivity.access$0 (SelectVideoActivity.java:60)
  at video.format.converter.view.SelectVideoActivity$loadVideo.doInBackground (SelectVideoActivity.java:170)
  at video.format.converter.view.SelectVideoActivity$loadVideo.doInBackground (SelectVideoActivity.java:1)
  at android.os.AsyncTask$2.call (AsyncTask.java:304)
  at java.util.concurrent.FutureTask.run (FutureTask.java:237)

我确实在我的项目中实现了新的权限模型,我确实要求WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,但仍然是异常。获取视频列表并使用属性填充我的POJO类的任何好方法:

   public String Duration;
   public Uri VideoUri;
   public long videoId;
   public String videoName;
   public String videoPath;

2 个答案:

答案 0 :(得分:0)

    from tkinter import *
    import matplotlib
    import pandas as pd
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud
    from matplotlib.figure import Figure

    master = Tk()
    separator3 = Frame(height=618,width=180, bd=4, bg='dodgerblue')
    separator6 = Frame(height=250,width=240, bd=4, bg='dodgerblue')
    separator1 = Frame(height=100,width=100, bd=1,bg='dodgerblue')

    def get():
      Disp_pos =10
      Disp_neg =-12
      w = Scale(separator6, from_=10, to=0,orient=VERTICAL)
      w.set(Disp_pos)
      w.pack(anchor=CENTER,side=TOP,ipady=10,ipadx=10)

      Label1 = Label(separator6, text="")
      Label1.pack(anchor=CENTER, side=TOP)
      f3 = Figure(figsize=(2, 3), dpi=100)
      canvas2 = FigureCanvasTkAgg(f3, master=separator3)
      Label1 = Label(separator3,text="  WORD  CLOUD ")
      Label1.pack(anchor=CENTER, side=TOP)
      ax3 = f3.add_subplot(111)
      text = 'sample'
      print(type(text))
      ax3.set_wordcloud = WordCloud().generate(text)
      ax3.imshow(ax3.set_wordcloud, interpolation='bilinear')
      ax3.axis("off")
      canvas2.show()
      canvas2.get_tk_widget().pack( side=BOTTOM,fill=BOTH, expand=1)
      canvas2.draw()
      separator2 = Frame(height=150, width=280, bd=4, bg='dodgerblue')
      scrollbar = Scrollbar(separator2)
      scrollbar.pack(side=RIGHT, ipady=270, fill=Y)
      Label1 = Label(separator2, text=" TEXT ",font=('Times', 12))
      Label1.pack(anchor=CENTER, side=TOP)
      i = 'sample sample sample'
      Re=Listbox(separator2,yscrollcommand=scrollbar.set)                      
      Re.insert(END, i)
      Re.pack()
      scrollbar.config(command=Re.yview)
      separator2.pack(side=TOP, padx=10, pady=10, fill=BOTH)

    Button1 = Button(separator1, text='  GET  ', font=('Times', 
                     15,'bold'),command=get,  bg="wheat2",relief=RAISED)
    Button1.pack(anchor=CENTER,pady=5)
    separator1.pack(fill=BOTH,side=LEFT, padx=5, pady=5)
    separator6.pack(fill=BOTH,side=RIGHT, padx=5, pady=5)
    separator3.pack(side=BOTTOM,fill=BOTH,padx=5, pady=5)
    master.config(bg='white')
    master.title('sample')
    mainloop()

答案 1 :(得分:0)

我认为您正在使用Android Marshmallow或更高版本。您需要获得READ_EXTERNAL_STORAGE的运行时权限。将它放入清单中将不适用于Android 6+。以下是添加运行时权限的链接。word2vec skip-gram model

不推荐使用托管查询,查询如下:

 Cursor var1 = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, new String[]{"_data", "_id", "_display_name", "duration"}, (String)null, (String[])null, " _id DESC");
相关问题