【问题标题】:Change address for load images to Gallery application更改将图像加载到图库应用程序的地址
【发布时间】:2013-09-09 13:15:29
【问题描述】:

我有示例应用程序,我想从 SD 卡中的某个位置加载图像,而不是从资产中加载图像,就像在示例中一样。但我不知道,我该怎么做。

此类包含来自资产的负载。

public class GalleryFileActivity extends Activity {

private GalleryViewPager mViewPager;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String[] urls = null;
    List<String> items = new ArrayList<String>();

    try {

        File dir = new File("/mnt/sdcard/images/");
        File file[]=dir.listFiles();

        urls = getAssets().list("");



        File sdCard = Environment.getExternalStorageDirectory();

        File images = new File (sdCard.getAbsolutePath() + "/foto");


          File[] imagelist = images.listFiles(new FilenameFilter(){  

                public boolean accept(File dir, String name)  
                {  
                    return ((name.endsWith(".jpg"))||(name.endsWith(".png")));  
                }  
            });  
                urls = new String[imagelist.length];  

                for(int i= 0 ; i< imagelist.length; i++)  
                {  
                    urls[i] = imagelist[i].getAbsolutePath();  
                }  






    } catch (IOException e) {
        e.printStackTrace();
    }

    FilePagerAdapter pagerAdapter = new FilePagerAdapter(this, items);
    pagerAdapter.setOnItemChangeListener(new OnItemChangeListener()
    {
        @Override
        public void onItemChange(int currentPosition)
        {
            Toast.makeText(GalleryFileActivity.this, "Current item is " + currentPosition, Toast.LENGTH_SHORT).show();
        }
    });

    mViewPager = (GalleryViewPager)findViewById(R.id.viewer);
    mViewPager.setOffscreenPageLimit(3);
    mViewPager.setAdapter(pagerAdapter);
}

public void copy(InputStream in, File dst) throws IOException {

    OutputStream out = new FileOutputStream(dst);

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

}

主类。

public class MainActivity extends ListActivity {

public static final String TITLE = "title";
public static final String SUBTITLE = "subtitle";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
    onListItemClick();
    setListAdapter(createAdapter());
}

protected Map<String, String> createElement(String title, String subtitle) 
{
    Map<String, String> result = new HashMap<String, String>();
    result.put(TITLE, title);
    result.put(SUBTITLE, subtitle);
    return result;
}
public List<Map<String, String>> getData() 
{
    List<Map<String, String>> result = new ArrayList<Map<String,String>>();

    result.add(createElement("Local load", "In this example, you provide list of files  to display in gallery"));
    return result;
}

public ListAdapter createAdapter() 
{
    SimpleAdapter adapter = new SimpleAdapter(this, getData(), 
            android.R.layout.simple_list_item_2, 
            new String[]{TITLE, SUBTITLE}, 
            new int[]{android.R.id.text1, android.R.id.text2});
    return adapter;
}

protected void onListItemClick() {
    Intent i = null;


        i = new Intent(this, GalleryFileActivity.class);

    startActivity(i);
}

}

我认为不重要,但为了安全起见 XML。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.truba.touchgallery"
android:versionCode="2"
android:versionName="1.2"
android:installLocation="auto" >

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"

    android:allowBackup="false" >
    <activity
        android:name="ru.truba.touchgallery.GalleryUrlActivity"
        android:configChanges="orientation" >
    </activity>
    <activity
        android:name="ru.truba.touchgallery.GalleryFileActivity"
        android:configChanges="orientation" >
    </activity>
    <activity
        android:name="ru.truba.touchgallery.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

在模拟器上运行,(文件夹 foto 不存在),但我认为错误在另一个地方。

FATAL EXCEPTION: main
09-09 18:10:49.968: E/AndroidRuntime(12289): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.truba.touchgallery/ru.truba.touchgallery.GalleryFileActivity}: java.lang.NullPointerException
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.os.Looper.loop(Looper.java:137)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.ActivityThread.main(ActivityThread.java:5041)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at java.lang.reflect.Method.invokeNative(Native Method)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at java.lang.reflect.Method.invoke(Method.java:511)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at dalvik.system.NativeStart.main(Native Method)
09-09 18:10:49.968: E/AndroidRuntime(12289): Caused by: java.lang.NullPointerException
09-09 18:10:49.968: E/AndroidRuntime(12289):    at ru.truba.touchgallery.GalleryFileActivity.onCreate(GalleryFileActivity.java:63)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.Activity.performCreate(Activity.java:5104)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
09-09 18:10:49.968: E/AndroidRuntime(12289):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
09-09 18:10:49.968: E/AndroidRuntime(12289):    ... 11 more

【问题讨论】:

    标签: java android image load sd-card


    【解决方案1】:

    编辑:

    编辑 2:

    File sdCard = Environment.getExternalStorageDirectory();
    
    File images = new File (sdCard.getAbsolutePath() + "/foto");
    
    
      File[] imagelist = images.listFiles(new FilenameFilter(){  
            @override  
            public boolean accept(File dir, String name)  
            {  
                return ((name.endsWith(".jpg"))||(name.endsWith(".png"))  
            }  
        });  
            urls = new String[imagelist.length];  
    
            for(int i= 0 ; i< imagelist.length; i++)  
            {  
                urls[i] = imagelist[i].getAbsolutePath();  
            }  
    

    编辑:(清单) 添加此权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    把这部分改成这样:

     <activity
            android:name="GalleryFileActivity"
            android:configChanges="orientation" >
        </activity>
    

    【讨论】:

    • 谢谢,但我应该替换代码的哪一部分?也许用 "urls = getAssets().list("");" 换行?
    • 在您的问题中,您没有指定要在哪里(在什么文件中)获取图像。我会用一些示例代码更新我的答案,希望对您有所帮助。
    • 我有文件夹“foto”在:/SD-card/foto 我想从这里加载图像。谢谢。
    • 我更新的代码是用于获取所有图像,但在这种情况下,我将再次使用 uodated...
    • 我要测试一下。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2014-08-07
    • 2015-08-10
    • 2012-04-05
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多